2009-10-19 2 views
11

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

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

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

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

+0

Крест отвечал: http://serverfault.com/questions/76031/shell-scripting-using-find-to-delete-files-matching-a-pattern –

ответ

24

Попробуйте использовать:

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

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

5

Проверьте флаг -0 на xargs; в сочетании с find-print0 вы должны быть установлены.

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

Не используйте xargs. Найти можете сделать это без посторонней помощи:

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

+3

Это всегда хорошо чтобы избежать запуска дополнительного процесса, особенно что-то вроде этого, где вы могли бы обеспечить слишком долго для xargs. Обратите внимание, что 'find' даже имеет действие' delete', которое вы можете использовать вместо '-exec ...' - но это проще настроить таким образом. Вам также не нужно указывать фигурные скобки, если вы не используете старую оболочку, такую ​​как tcsh. – Cascabel

+3

Но это запустит процесс 'rm' для каждого файла отдельно, вместо того, чтобы передавать несколько имен файлов в' rm', например 'xargs', так что это будет медленнее. – JaakkoK

+5

@jk: Вот почему более новые реализации 'find' имеют' find -exec rm '{}' + ', которые будут выставлять аргументы так же, как' xargs'. – ephemient

0
find -iname pattern 

использование -iname для поиска шаблона

0

Чтобы избежать космического вопроса в xargs I 'd использовать новый символ линии как sep arator с опцией -d:

find . -name vmware-*.log | xargs -d '\n' rm