3

Как удалить все * .foo в дереве каталогов?

rm -r *.foo

не работает.

Я мог бы попробовать цикл, но это требует рекурсивного расширения:

for x in */*/.../*.foo
    do rm $x
done

Что тоже невозможно.

4 ответа4

9

Вы можете использовать find:

find -name '*.foo' -delete
4

Предполагая, что у вас довольно свежая версия bash:

shopt -s globstar
rm -- **/*.foo
1

Вы можете попробовать использовать find:

find /dir/path -name *.foo -exec rm -f {} \;
0

Одним из самых простых решений было бы использовать команду find с параметром exec :

find /path/where/to/start/search -type f -name "*.foo" -exec rm {} \;

Это будет искать все файлы с именем * .foo и выполнять rm {имя_файла} для каждого.

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

find /path/where/to/start/search -type f -name "*.foo" | xargs rm 

Это найдет все файлы и поместит имена файлов за командой rm до максимальной длины команды, поддерживаемой вашим дистрибутивом / оболочкой, поэтому при запуске она будет выглядеть так:

rm dir1/file1.foo dir1/file2.foo dir1/file3.foo 

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .