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


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~

коли ти задоволений цим.

Адаптувати та розширити під свої потреби!

Примітка. Вам потрібно буде відкрити новий термінал, щоб зміни вступили в силу.


Спасибі! Це чудово працює, а сухий біг надзвичайно корисний.
Виняк Гарг

2
find -type f -name '*~' -delete(зброя за вибором, крім того git clean -dfx .)
sehe

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параметр необов’язковий, але додавши його, ви покажете, які файли було видалено.


+1 Дякую! Але куди я додаю цю функцію?
Vinayak Garg

@VinayakGarg Ви також можете додати його до своїх .bash_aliases, але я зазвичай кладу їх прямо в моєму .bashrc.
Лекенштейн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.