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

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

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

Спасибо!

15
задан 2 January 2013 в 00:41

2 ответа

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

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~

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

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

Примечание. Необходимо будет открыть новый терминал для изменений для вступления в силу.

26
ответ дан 2 January 2013 в 00:41

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

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

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

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

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

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

0
ответ дан 2 January 2013 в 00:41

Другие вопросы по тегам:

Похожие вопросы: