Много дней назад я нашел этот полезный псевдоним bash (содержимое моего ~ / .bash_aliases )
# aliases
# finds temporary files ending with '~' and deletes them
alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f'
Теперь я попытался использовать rm~
после cd
для некоторый каталог, содержащий 3 файла, оканчивающиеся на ~
Я получил эту ошибку в терминале, и файлы не удалялись
find: paths must precede expression: 1n.in~
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
Также, когда я пытался rm~
из /home/me
кажется, ничего не делает. Или это может занять много времени.
Скажите, пожалуйста, почему я получаю ошибку и как ее исправить.
Спасибо!
Ваш псевдоним удара не правильно написан (одинарные кавычки не хорошо используются). Вместо этого это должно быть:
alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f'
Теперь, мне лично не нравится бесполезное использование каналов и xargs
, таким образом, Ваш псевдоним был бы лучше записан как:
alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +'
-type f
опция, чтобы найти только файлы (не каталоги, ссылки, и т.д.), -v
опция к rm
чтобы быть подробным (распечатывает то, что это удаляет). +
в конце так, чтобы find
выполнения rm
со всеми найденными файлами (порождает только один экземпляр rm
, вместо одного на файл).
Теперь от man bash
:
Почти для каждой цели псевдонимы заменяются функциями оболочки.
Вместо псевдонима лучше использовать функцию: прокомментируйте свой псевдоним в .bash_aliases
файл (т.е. помещенный a #
перед той строкой), и в файле .bashrc
, поместите эту функцию (где угодно в файле, в конце прекрасен):
rm~() {
find . -name "*~" -type f -exec /bin/rm -fv -- {} +
}
Кроме того, как другой ответ упоминает, можно использовать -delete
управляйте для нахождения. В этом случае, Ваш rm~
функция будет:
rm~() {
find . -name "*~" -type f -printf "Removing file %p\n" -delete
}
На самом деле можно сделать прохладную функцию, которая возьмет аргумент, скажет --dry-run
, это только произведет то, что это удалит:
rm~() {
case "$1" in
"--dry-run")
find . -name "*~" -type f -printf "[dry-run] Removing file %p\n"
;;
"")
find . -name "*~" -type f -printf "Removing file %p\n" -delete
;;
*)
echo "Unsupported option \`$1'. Did you mean --dry-run?"
;;
esac
}
Затем используйте как:
rm~ --dry-run
только показать файлы, которые будут удалены (но не удалят их), и затем
rm~
когда Вы довольны этим.
Адаптируйтесь и расширитесь на свои потребности!
Примечание. Необходимо будет открыть новый терминал для изменений для вступления в силу.
*~
раскрывается оболочкой до того, как она назначается вашему псевдониму. Фактическое назначение:
alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f'
Я предлагаю использовать функции вместо псевдонимов, они гораздо более мощные и их легче обрабатывать в отношении кавычек.
Пока мы это делаем, удалите лишнее .
(текущий каталог подразумевается, если параметры не указаны) и прекратите злоупотреблять xargs
, поскольку опция -delete
уже существует.
rm~() { find -name '*~' -ls -delete; }
Опция -ls
является необязательной, но добавив ее, вы увидите, какие файлы были удалены.