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

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

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

Спасибо!

    
задан Vinayak Garg 28.12.2012 в 09:46
источник

2 ответа

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 :

For almost every purpose, aliases are superseded by shell functions.

Вместо псевдонима лучше использовать функцию: прокомментировать свой псевдоним в файле .bash_aliases (т. е. поставить # перед этой строкой), а в файле .bashrc поместить этот < em> function (в любом месте файла, в конце это хорошо):

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 28.12.2012 в 11:01
источник
9

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

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

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

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

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

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

    
ответ дан Lekensteyn 28.12.2012 в 09:54