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

17

Я пытаюсь написать команду bash, которая удалит все файлы, соответствующие определенному шаблону - в данном случае это все старые файлы журнала vmware, которые были созданы.

Я пробовал эту команду:

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

Однако когда я запускаю команду, она заглушает все папки, в именах которых есть пробелы. Есть ли способ отформатировать путь к файлу, чтобы xargs передавал его в кавычки или правильно экранировал?

Дэн Монего
источник
Перекрестная публикация: stackoverflow.com/questions/1590297/…
приостановлена ​​до дальнейшего уведомления.

Ответы:

20

Я обычно нахожу, что использование этой -execопции для findоблегчения и менее запутанным. Попробуй это:

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

Все после -execсчитается командой для выполнения для каждого результата, вплоть до того ;, который здесь экранируется, так что он будет передан find. Символ {}заменяется именем файла, findкоторое обычно печатается.

После того, как вы убедились, что он делает то, что вы хотите, вы можете удалить -i.

Джефф Снайдер
источник
1
Кроме того, если вы хотите удалить только файлы, а не каталоги, вы можете добавить '-type f' 'в команду find.
Джеймс Ханна
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вариант поиска . Он удаляет файл без ошибок с помощью специальных символов ...

Дом
источник