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

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

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

rm -r *.foo

не работает.

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

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

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

решение1

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

find -name '*.foo' -delete

решение2

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

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

решение3

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

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

решение4

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

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

Будет выполнен поиск всех файлов с именем *.foo и выполнение rm {filename} для каждого из них.

Если у вас много файлов, использование 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двоичный файл нужно запускать гораздо реже, что делает этот вариант более быстрым.

Связанный контент