Как удалить папки с определенным именем

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 с двумя подпапками. Все первые подпапки называются «окончательными» и содержат отредактированные файлы PDF и список содержимого Word. Все вторые подпапки с именем tif_pdf_various_names содержат первоначально отсканированные файлы, сохраненные в формате TIFF (некоторые до 200 страниц), их неотредактированные PDF-файлы и черновик списка содержимого .docx - таким образом, коллекция домашней работы. Мне нужно было сделать коллекцию из 410 папок, содержащих только окончательно отредактированный материал - с tiff, близкими к 4 ТБ. Самый простой метод нашел заключается в использовании (в Micr
Jurie

Ответы:

155

Если целевой каталог пуст, используйте поиск, фильтруйте только каталоги, фильтруйте по имени, выполняйте rmdir:

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

Если вы хотите рекурсивно удалить его содержимое, замените его -exec rmdir {} \;на -deleteили -prune -exec rm -rf {} \;. Другие ответы включают в себя подробности об этих версиях, зачислить их тоже.

фисташка
источник
9
Не могли бы вы объяснить, что {} \;делает?
winklerrr
6
{}может читаться как «для каждого соответствующего файла / папки», то есть заменяет каждый «найденный» файл / папку. \;является терминатором для -execпредложения.
wmorrison365
2
Это дает мне ошибку «невозможно удалить», когда каталог не пустой
blindeyes
1
Попробуйте добавить -pruneфлаг к ответу в соответствии с предложением Дэвида Грейсона. Без этого findвсе равно будет пытаться посетить отсутствующую папку и в конечном итоге завершится с кодом ошибки, который может, например, привести к сбою сборки Docker.
Чизби
160

Используйте find для имени «a» и выполните команду rm, чтобы удалить те, которые были названы в соответствии с вашими пожеланиями, следующим образом:

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

Сначала проверьте это с помощью ls для вывода списка:

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

Чтобы гарантировать удаление только каталогов, а не простых файлов, используйте аргумент "-type d" (как предлагается в комментариях):

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

"{}" - это подстановка для каждого найденного файла "a" - команда exec выполняется для каждого путем подстановки.

wmorrison365
источник
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`
Араш Фотухи
источник
@ Баффало, как получилось? Это дефо работает, но остальные тоже. Был бы удивлен, если бы нашел env, где это работает, но другие по существу не дают всех ответов find/rm.
wmorrison365
4
@ wmorrison365, потому что если вы это сделаете find . -name a -exec rm -rf {} \;, при попытке войти в этот каталог произойдет сбой поиска, что приведет к ошибке вроде find: '1/2/3/a': No such file or directory.
Алекс Гронхольм
@Alex Grönholm, конечно, но все папки с именем 'a' тем не менее удалены. Как вы утверждаете, find не может впоследствии заглянуть в удаленную папку «a», но это не имеет значения. Желание сохранить содержимое «a» для последующей обработки перед удалением - это другой случай использования, чем тот, о котором просил OP.
wmorrison365
6
@ wmorrison365 Да, каталоги удалены, но я не думаю, что было бы хорошо рекомендовать решение, в котором команда не выполняется (возвращает ненулевой код выхода).
Алекс Гронхольм
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 {} \;

Благодаря фисташке

mpalumbo7
источник
Ах, это отлично сработало, чтобы сделать это чем-то, что вы могли бы с легкостью использовать, вы можете сохранить это как небольшой сценарий оболочки: 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весь компьютер, ваш компьютер будет удален без возможности вернуть его, что потребует переустановки ОС.

Slevin
источник
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 {} \;
Thamaraiselvam
источник
8

Комбинируя несколько ответов, вот команда, которая работает как в Linux, так и в MacOS

rm -rf $(find . -type d -name __pycache__)
marcosfede
источник
Только один, который работал у меня, который также не
выдавал
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)
dgrigonis
источник
3
Этот ответ работает только для пустых папок. -deleteне удаляет непустые папки.
Манинак
Спасибо за добавление версии для OSX
schu34
6

Эта команда работает для меня. Он выполняет свою работу рекурсивно

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

, - текущая папка

"node_modules" - имя папки

1nstinct
источник
-2

найти путь / к / папкам / -maxdepth 1 -name "my_ *" -type d -delete

PickleRick
источник