Найти и удалить все каталоги с именем «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 вместо его прерывания
  • Как проверить текущее дисковое пространство, используемое моим Linux?
  • Как читать одну строку из `tail -f` через конвейер, а затем завершать?
  • Как запустить vim без выполнения / etc / vimrc?
  • Подключение к сети Wi-Fi через терминал Mac
  • Как интерпретировать результаты команды `ls -l`?
  • Unix: файлы, начинающиеся с тире, -
  • Инструменты Unix: что, если файл называется минусом?
  • Unix: Есть ли способ «скопировать» разрешения файлов или каталогов?
  • Каков рекомендуемый каталог для хранения содержимого веб-сайта?
  • Есть ли способ перейти в любой каталог из любого другого каталога напрямую?
  • Interesting Posts

    Я хочу контролировать и ограничивать передачу данных OS X, пока я подключаюсь через свой iPhone

    Переход от 127.0.0.1 до 2130706433 и обратно

    Windows 10 Visual Studio 2015. XML-ассоциация файлов

    Как переопределить метод добавления List на C #?

    Почему Excel удаляет ведущие нули при отображении CSV-данных?

    Расширение файла для файлов Markdown?

    XmlWriter для записи в строку вместо файла

    Android Studio: создание ландшафтных макетов

    Объединение вложенных classов с использованием SASS

    FileZilla FTP для AWS EC2 Windows Server 2012 Экземпляр: не удалось получить список каталогов

    Компьютерный уход: спящий режим, спящий режим или выключение?

    Размер файла для файла ftp-сервера vs фактический размер файла

    Реализуйте очередь, в которой push_rear (), pop_front () и get_min () – все операции с постоянным временем

    Где я могу получить копию файла libstdc ++. So.6.0.15

    Изменить расположение узла node_modules

    Давайте будем гением компьютера.