Команда для удаления временных файлов, заканчивающихся на ~

15

Много дней назад я нашел этот полезный псевдоним 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, это , кажется , не делать ничего. Или это может занять много времени.

Скажите, пожалуйста, почему я получаю ошибку и как ее исправить.

Благодарность!

Винаяк Гарг
источник

Ответы:

26

Ваш псевдоним bash написан плохо (одинарные кавычки не очень хорошо используются). Вместо этого должно быть:

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файле (т.е. поместите #перед этой строкой), а в файле .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~

когда ты доволен этим.

Адаптируйся и расширяй свои потребности!

Заметка. Вам нужно будет открыть новый терминал, чтобы изменения вступили в силу.

gniourf_gniourf
источник
Благодарность! Это работает хорошо, и пробный прогон чрезвычайно полезен.
Винаяк Гарг
2
find -type f -name '*~' -delete(оружие выбора, кроме того git clean -dfx .)
сехе
2
Это такое элегантное решение, я должен был войти, чтобы дать вам реквизит. +1 тебе, мой молодец!
CodeChimp
9

*~расширяется оболочкой до того, как назначается вашему псевдониму. Фактическое назначение:

alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f'

Я предлагаю использовать функции вместо псевдонимов, они намного мощнее и проще в обращении с кавычками.

Пока мы занимаемся этим, удалите лишнее .(текущий каталог подразумевается, если параметры не заданы) и прекратите злоупотреблять, xargsтак как -deleteопция уже существует.

rm~() { find -name '*~' -ls -delete; }

-lsПараметр обязателен, но это покажет вам , какие файлы были удалены.

Lekensteyn
источник
+1 Спасибо! Но куда мне добавить эту функцию?
Винаяк Гарг
@VinayakGarg Ты тоже можешь добавить это к себе .bash_aliases, но я обычно кладу их прямо в мою .bashrc.
Лекенштейн