Shell Scripting: использование bash с xargs
Я пытаюсь написать команду bash, которая удалит все файлы, соответствующие определенному шаблону, - в этом случае все старые файлы журнала vmware, которые были созданы.
Я пробовал эту команду:
find . -name vmware-*.log | xargs rm
Однако, когда я запускаю команду, она задыхается во всех папках с пробелами в именах. Есть ли способ отформатировать путь к файлу так, чтобы xargs передавал его в rm, процитированный или правильно экранированный?
Ответы
Ответ 1
Попробуйте использовать:
find . -name vmware-*.log -print0 | xargs -0 rm
Это заставляет find выводить нулевой символ после каждого имени файла и сообщает xargs разбить имена на основе нулевых символов вместо пробелов или других токенов.
Ответ 2
Не используйте xargs. Найти можно сделать без всякой помощи:
find . -name "vmware-*.log" -exec rm '{}' \;
Ответ 3
Проверьте флаг -0
для xargs
; в сочетании с find
-print0
вы должны быть установлены.
find . -name vmware-*.log -print0 | xargs -0 rm
Ответ 4
Найти GNU
find . -name vmware-*.log -delete
Ответ 5
find . -name vmware-*.log | xargs -i rm -rf {}
Ответ 6
find -iname pattern
используйте -iname
для поиска по шаблону
Ответ 7
Чтобы избежать проблем с пространством в xargs, я бы использовал новый символ строки в качестве разделителя с опцией -d:
find . -name vmware-*.log | xargs -d '\n' rm