Найти и удалить все каталоги с именем «test» в linux

У меня есть много каталогов с именем «test», и я хотел бы удалить их.

Я знаю, как их найти и распечатать, используя:

find . -name test -print 

Теперь, как удалить каталоги?


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

7 Solutions collect form web for “Найти и удалить все каталоги с именем «test» в linux”

xargs делает всю магию:

 find . -name test -type d -print0|xargs -0 rm -r -- 

xargs выполняет команду, переданную как параметры, с аргументами, переданными в stdin.

Это использует rm -r для удаления каталога и всех его дочерних элементов.

Обозначает конец аргументов, чтобы избежать пути, начинающегося с - из-за того, что он рассматривается как аргумент.

-print0 сообщает find для печати \0 символов вместо строк новой строки; И -0 указывает xargs обрабатывать только \0 как разделитель аргументов.

Это вызов rm со многими каталогами одновременно, избегая накладных расходов на вызов rm отдельно для каждого каталога.


В качестве альтернативы find также может запускать команду для каждого выбранного файла:

 find . -name test -type d -exec rm -r {} \; 

И этот, с лучшей производительностью, поскольку он сразу вызовет rm с несколькими каталогами :

 find . -name test -type d -exec rm -r {} + 

(Обратите внимание на + в конце, это эквивалентно решению xargs ).

 find /path/to/dir -name "test" -type d -delete 
  • -name: ищет имя переданное. Вы можете использовать -regex для предоставления имен на основе регулярных выражений

  • Тип: ищет типы файлов. d ищет директории

  • -delete: действие, которое удаляет найденный список.

В качестве альтернативы:

 find /path/to/dir -name "test" -type d -exec rm -rf {} \; 

Как отметил в комментариях Дж. Ф. Себастьян :

Вы можете использовать + вместо \; Для одновременной передачи нескольких каталогов.

Еще один способ сделать это

 find . -name test -exec rm -R "{}" \; 

Полезная ссылка на find: http://www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml

Вы также можете использовать опцию -exec

 find . -name test -exec rm {} \; 

Предположим, что вы используете gnu find , вы можете использовать опцию -delete:

find . -name test -delete

Который легче запомнить.

Как еще один ответ, вы можете попытаться найти все каталоги с test имени и удалить их

 find -name "test" -type d -delete 

Я столкнулся с некоторыми проблемами с перекрестной совместимостью на Mac, поэтому я использовал эту эквивалентную команду:

 find -path "*/test" -type d -delete 
  • -path : ищет шаблон в полностью квалифицированном имени файла.

Однако в любом случае, если в любом из названных test каталогов есть файлы, find будет жаловаться на то, что Directory is not empty и не удалит каталог.

Если вы хотите удалить все файлы, включая test каталог, то мы можем использовать тот же трюк, чтобы сначала удалить все файлы внутри каталогов с именем test .

 find -path "*/test/*" -delete 

Шаблон: "*/test/*" , гарантирует, что мы удалим только файлы внутри каталога с именем /test/ . Когда каталоги пусты, мы можем продолжить и удалить каталоги, используя первую команду:

 find -path "*/test" -type d -delete 

Пример:

 $ tree . ├── mytest │  └── test │  └── blah.txt ├── test │  ├── bar.jpg │  └── dir │  └── bar.bak └── testdir └── baz.c 5 directories, 4 files $ find -path "*/test" -type d -delete $ tree . ├── mytest │  └── test ├── test └── testdir └── baz.c 4 directories, 1 file $ find -name "test" -type d -delete $ tree . ├── mytest └── testdir └── baz.c 2 directories, 1 file 

Предполагая, что bash 4+

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

Конечная косая черта означает, что она будет соответствовать только каталогам. Тест выполняется заранее:

 printf '%s\n' ./**/test/ 
  • Поиск всех символических и жестких ссылок на файл в UNIX
  • Как изменить пользователя в WinSCP?
  • Использование инструмента командной строки cURL на Mac, что я могу сделать с этим скриптом, чтобы попросить его получить данные запаса, которые заменят запятые NO SPACES
  • Как проверить текущее дисковое пространство, используемое моим Linux?
  • Как я могу использовать ssh для запуска команды на удаленном компьютере Unix и выйти до завершения команды?
  • Как интерпретировать SMART-атрибуты?
  • Unix zip, но исключил определенные подкаталоги (и все в них)
  • Можно ли перенести процесс переднего плана на задний план без приостановки (control + z)?
  • Есть ли эквивалент Windows для команды «strings» Unix?
  • Страница Bash Man: kill <pid> vs kill -9 <pid>
  • Основной вопрос * nix (Mac OS X): Где мой путь установлен?
  • Давайте будем гением компьютера.