Як видалити папки з певним іменем


139

Як в Linux видалити папки з певним іменем, які вкладені в ієрархію папок?

Наступні шляхи знаходяться під папкою, і я хотів би видалити всі названі папки a.

1/2/3/a
1/2/3/b
10/20/30/a
10/20/30/b
100/200/300/a
100/200/300/b

Яку команду Linux я повинен використовувати з батьківської папки?


Можливо, пункт пропущений, але, можливо, це комусь допомагає: у мене в основній папці 410 папок - кожна з 410 має дві підпапки. Усі перші підпапки мають назву "остаточні" і містять відредаговані файли pdfs та список вмісту Word. Усі другі підпапки з назвою tif_pdf_various_names містять оригінально відскановані збережені до tiff файли (деякі до 200 сторінок), їхні невідредаговані файли pdfs та чернетку .docx списку вмісту - таким чином, домашня колекція робочих місць. Мені потрібно було скласти колекцію 410 папок, що містять лише остаточно відредагований матеріал - з тифками, близькими до 4 ТБ. Найпростішим методом було виявлено використання (у Micr
Jurie

Відповіді:


155

Якщо цільовий каталог порожній, використовуйте find, фільтруйте лише каталоги, фільтруйте по імені, виконайте rmdir:

find . -type d -name a -exec rmdir {} \;

Якщо ви хочете рекурсивно видалити його вміст, замінити -exec rmdir {} \;на -deleteабо -prune -exec rm -rf {} \;. Інші відповіді містять детальну інформацію про ці версії, заслуговуйте також на них.


9
Скажіть, будь ласка, що {} \;робить?
winklerrr

6
{}можна читати як "для кожного відповідного файлу / папки" - тобто він замінює кожен "знайдений" файл / папку. \;є термінатором для -execпункту.
wmorrison365

2
Це дає мені помилку "не можу видалити", коли каталог не порожній
blindeyes

1
Розгляньте можливість додавання -pruneпрапора у відповідь відповідно до пропозиції @David Grayson. Без цього findвсе одно намагатиметься відвідати папку, що зараз відсутня, і врешті-решт вийде з кодом помилки, який може, наприклад, вийти з ладу докерської збірки.
Чізбі

160

Використовуйте для назви "a" і виконайте rm, щоб видалити названих відповідно до ваших побажань:

find . -name a -exec rm -rf {} \;

Спершу тестуйте, використовуючи ls для переліку:

find . -name a -exec ls {} \;

Щоб переконатися, що це видаляє лише каталоги, а не прості файли, використовуйте аргумент "-типу d" (як запропоновано в коментарях):

find . -name a -type d -exec rm -rf {} \;

"{}" - це заміна кожного знайденого файлу "a" - команда exec виконується проти кожного шляхом заміни.


4
Ви, ймовірно, хочете додати "-типу d" туди, лише якщо файл відповідає тому ж імені.
Марк Лозер

3
Також зауважте, що це спричинить щось на кшталт 1/2/a/3/4, що може бути не задумано, тому +1 за рекомендацію перевірити спочатку ...
twalberg

9
реце, echo {}щоб перевірити його спочатку, замістьls {}
Чарні Кей

2
Ось іди моя node_modules/.
saruftw

6
Я використовував find . -name a -type d -exec rm -rf {} \;і він працював, хоча він роздруковувався find: ‘./subdir/subdir/a’: No such file or directoryдля кожного видаленого каталогу.
pacoverflow

59

Це також працює - він видалить усі папки під назвою "a" та їх вміст:

rm -rf `find -type d -name a`

@Buffalo, як це? Це дефо працює, але так само, як і інші. Буду здивований, коли знайдеться середовище, де це працює, але інші не дають усіх відповідей по суті find/rm.
wmorrison365

4
@ wmorrison365, тому що якщо ви це зробите find . -name a -exec rm -rf {} \;, пошук виявиться крашним , коли він спробує увійти до цього каталогу, щоб шукати більше елементів, що дасть вам помилку find: '1/2/3/a': No such file or directory.
Alex Grönholm

@Alex Grönholm впевнений, але всі папки з назвою "a" все-таки видаляються. Як ви заявляєте, пошук не може згодом заглянути все до видаленої папки "a", але це не має значення. Бажати зберегти вміст "a" для подальшої обробки перед видаленням - це інший випадок використання, ніж запитував ОП.
wmorrison365

6
@ wmorrison365 Так, каталоги видалені, але я не думаю, що рекомендувати рішення, коли команда не працює (повертає ненульовий код виходу), не рекомендується.
Alex Grönholm

1
Це дало мені помилку illegal option --t. Я повинен був також передати каталог для пошуку в ( stackoverflow.com/questions/25840713 / ... ) rm -rf `find . -type d -name a`.
Стів Харрісон

25

Щоб видалити всі каталоги з назвою foo, запустіть:

find -type d -name foo -a -prune -exec rm -rf {} \;

В інших відповідях відсутня важлива річ: -pruneваріант. Без цього -pruneGNU find видалить каталог із відповідною назвою, а потім спробує повторити його, щоб знайти більше відповідних каталогів. -pruneОпція вказує йому не рекурсию в каталог , який відповідає умовам.


21

Я опинився тут, щоб видалити свої node_modulesпапки, перш ніж робити резервну копію моєї роботи rsync. Основна вимога - node_modulesпапка може бути вкладеною, тому вам потрібна-prune опція.

Спочатку я запустив це, щоб візуально перевірити папки, які потрібно видалити:

find -type d -name node_modules -prune

Потім я запустив це, щоб видалити їх усіх:

find -type d -name node_modules -prune -exec rm -rf {} \;

Завдяки фісташку


Ах, це добре працювало, щоб зробити це щось, що ви могли б використовувати з легкістю, ви можете зберегти це як невеликий оболонку: sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
Feirell

11
find ./ -name "FOLDERNAME" | xargs rm -Rf

Слід зробити трюк. ПОПЕРЕДЖЕННЯ, якщо ви випадково закачали .або /на xargs rm -Rfвесь комп'ютер буде видалено без можливості повернути його, вимагаючи перевстановлення ОС.


2
О, просто той крихітний ризик. Це все? Ха-ха. Супер дякую за попередження. Я напевно зробив би цю помилку введення тексту.
TinkerTenorSoftwareGuy

9

У мене було більше 100 файлів на кшталт

log-12
log-123
log-34
....

вище відповіді для мене не спрацювали

але мені допомогла наступна команда.

find . -name "log-*" -exec rm  -rf {} \;

я дав -typeяк. так вона видаляє як файли і папки , які запускаються зlog-

і rm -rf рекурсивно видаляє папки, навіть якщо в ньому є файли.

якщо ви хочете, щоб папки були одні

find -type d -name "log-*" -exec rm  -rf {} \;

файли поодинці

find -type f -name "log-*" -exec rm  -rf {} \;

8

Поєднуючи кілька відповідей, ось команда, яка працює як на Linux, так і на MacOS

rm -rf $(find . -type d -name __pycache__)

Тільки той, хто працював на мене, але також не кидав помилок
Kloar

7

Інший:

"-exec rm -rf {} \;" can be replaced by "-delete"

find -type d -name __pycache__ -delete      # GNU find
find . -type d -name __pycache__ -delete    # POSIX find (e.g. Mac OS X)

3
Ця відповідь працює лише для порожніх папок. -deleteне видаляє непорожні папки.
maninak

Дякуємо, що додали версію OSX
schu34

6

Ця команда працює для мене. Вона робить свою роботу рекурсивно

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

. - поточна папка

"node_modules" - назва папки


-2

знайти шлях / до / в / папки -maxdepth 1 -ім'я "my_ *" -типу d -delete

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.