Я пытаюсь написать команду 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
вариант. Удаляет файл без ошибок со специальными символами ...