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