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