Рекурсивно удалить все файлы с заданным расширением [duplicate]

    

У этого вопроса уже есть ответ:

    

Я хочу удалить все * .o файлы в каталог и его подкаталоги. Однако я получаю сообщение об ошибке:

[email protected]:~/.Workspace.OLD$ rm -r *.o
rm: cannot remove `*.o': No such file or directory

С другой стороны, rm *.o работает, но он не рекурсивный.

rm
111 голосов | спросил sashoalm 22 FebruaryEurope/MoscowbSat, 22 Feb 2014 16:39:50 +0400000000pmSat, 22 Feb 2014 16:39:50 +040014 2014, 16:39:50

2 ответа


173

Это зло: rm -r не для удаления файлов, а для удаления каталогов. К счастью, вероятно, нет каталогов, соответствующих *.o.

То, что вы хотите, возможно с zsh, но не с sh или bash (новые версии bash не могут сделать это по умолчанию, но если shell option globstar: shopt -s globstar). Шаблон globbing - это **/*.o, но это тоже не ограничивается файлами (возможно, zsh имеет трюки для исключения нефайлов).

Но это скорее для find:

find . -type f -name '*.o' -delete

или (поскольку я не уверен, что -delete - POSIX)

find . -type f -name '*.o' -exec rm {} +
ответил Hauke Laging 22 FebruaryEurope/MoscowbSat, 22 Feb 2014 16:49:57 +0400000000pmSat, 22 Feb 2014 16:49:57 +040014 2014, 16:49:57
35

Это не совсем так, как работает -r переключатель rm:

   -r, -R, --recursive
          remove directories and their contents recursively

rm не имеет функций поиска файлов, его переключатель -r не позволяет спускаться в локальные каталоги и идентифицировать файлы, соответствующие шаблону, который вы ему даете. Вместо этого шаблон (*.o) расширяется оболочкой, а rm будет спускаться и удалять любые каталоги, чье имя соответствует этому шаблону. Если у вас есть каталог, чье имя закончилось в .o, тогда ваша команда удалила бы его, но он не найдет файлы .o в подкаталогах.

Что вам нужно сделать, либо используйте find:

find . -name '*.o' -delete

, или для не-GNU find:

find . -name '*.o' -exec rm -r {} \;

В качестве альтернативы, если вы используете bash, вы можете включить globstar :

shopt -s globstar
rm -r -- **/*.o

ПРИМЕЧАНИЕ : все три параметра будут удалять каталоги, чье имя заканчивается в .o, если это не то, что вы хотите, используйте один из них:

find . -type f -name '*.o' -delete
find . -type f -name '*.o' -exec rm {} \;
rm -- **/*.o
ответил terdon 22 FebruaryEurope/MoscowbSat, 22 Feb 2014 16:52:07 +0400000000pmSat, 22 Feb 2014 16:52:07 +040014 2014, 16:52:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132