Як використовувати команду find для видалення файлів, що відповідають шаблону?


17

Я намагаюся написати команду bash, яка видалить усі файли, що відповідають певній схемі - у цьому випадку це всі зібрані старі файли журналу vmware.

Я спробував цю команду:

find . -name vmware-*.log | xargs rm

Однак, коли я запускаю команду, вона забивається на всі папки, які мають пробіли в їх назвах. Чи є спосіб відформатувати шлях до файлу так, щоб xargs передав його до цитованого або належним чином уникнутого?


Відповіді:


20

Я, як правило, вважаю, що використовувати -execпараметр для findпростіше і менш заплутано. Спробуйте це:

find . -name vmware-*.log -exec rm -i {} \;

Все після -exec- це команда для запуску для кожного результату, аж до того ;, який тут уникнути, щоб він був переданий find. {}Замінюється на ім'я файлу , який findбуде нормально друкувати.

Після того, як ви переконаєтесь, що він робить те, що ви хочете, його можна видалити -i.


1
Крім того, якщо це лише файли, які ви хочете видалити, а не каталоги, ви можете додати команду find '' -типу f ''.
JamesHannah

18

Якщо у вас є GNU, findви можете скористатися -deleteопцією:

find . -name "vmware-*.log" -delete

Щоб використовувати xargsта уникати проблеми з пробілами у назви файлів:

find . -name vmware-*.log -print0 | xargs -0 rm

Однак у ваших журнальних файлах не повинно бути пробілів у їх іменах. У текстових документах та файлах MP3, ймовірно, є їх, але ви повинні мати можливість керувати іменами файлів журналів.


Це акуратно. Я про це не знав.
Джефф Снайдер

8

Ви можете сказати find розмежувати список вихідних даних з NULL і xargsотримувати його вхідний список однаковим:

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

Крім того, переконайтеся, що ви ухиляєтесь від *зворотної косої риски, або містять vmware-*.logв одній лапки, інакше ваша оболонка може спробувати розширити її, перш ніж передати її find.


6

Не забувайте -deleteваріант пошуку. Він видаляє файл без помилок спеціальними символами ...

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