Знайдіть і видаліть усі каталоги з назвою "test" в Linux


35

У мене є багато каталогів під назвою "тест", і я хотів би їх видалити.

Я знаю, як їх знайти та роздрукувати за допомогою:

find . -name test -print

Тепер, як зробити видалення каталогів?


Зверніть увагу, що в мене також є файли в каталозі, і вони також повинні бути видалені.

Відповіді:


70

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рішенню.)


1
Відмінна відповідь, особливо +в знахідці. Я не мав уявлення, напевно хотів би, що це знав давно.
Скотт

стежте за останньою командою, якимось чином вона видалила деякі файли. xargsкоманда працювала добре.
Анріке де Суза

23
find /path/to/dir -name "test" -type d -delete
  • -name: шукає передане ім'я. Ви можете використовувати -regexдля надання імен на основі регулярних виразів

  • -type: шукає типи файлів. dшукає лише каталоги

  • -delete: дія, яка видаляє знайдений список.

Як варіант:

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

Як заявив JF Себастьян у коментарях:

Ви можете використовувати +замість того, \;щоб одночасно передавати більше одного каталогу.


1
Вибачте, я забув згадати, що ці каталоги можуть мати файли. Не вдалося видалити деякі з них через помилку "find: не можна видалити` ./start ': Каталог не порожній "
збирання сміття

@garbagecollection Я додав оновлення.
jaypal singh

3
ви можете використовувати +замість того, \;щоб одночасно передавати більше одного каталогу.
jfs

Дякую @JFSebastian Добре. Я додам це до відповіді.
jaypal singh


5

Ви також можете скористатися опцією -exec

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

3

Якщо припустити баш 4+

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

Косою косою рисою означає, що вона відповідатиме лише каталогам. Заздалегідь тест:

printf '%s\n' ./**/test/

2

Припустимо, що ви використовуєте gnu find , ви можете скористатися опцією -delete:

find . -name test -delete

що легше запам’ятати.


2

Як вказує інша відповідь, ви можете спробувати знайти всі каталоги з назвою 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.