Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

Если у вас есть GNU find вы можете использовать -delete вариант:

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

Использовать xargs и избежать проблемы с пробелами в именах файлов:

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

Однако в именах файлов журнала не должно быть пробелов. Документы текстового редактора и файлы MP3 могут иметь их, но вы должны иметь возможность контролировать имена файлов журналов.

Ты можешь сказать 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.

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