Comment supprimer des dossiers avec un certain nom

139

Sous Linux, comment supprimer des dossiers avec un certain nom qui sont imbriqués profondément dans une hiérarchie de dossiers?

Les chemins suivants sont sous un dossier et je voudrais supprimer tous les dossiers nommés 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

Quelle commande Linux dois-je utiliser à partir du dossier parent?

Joe
la source
Peut-être manquer le point, mais peut-être que cela aide quelqu'un: j'ai 410 dossiers dans un dossier principal - chacun des 410 avec deux sous-dossiers. Tous les premiers sous-dossiers sont nommés «final» et contiennent des fichiers PDF modifiés et une liste de contenu Word. Tous les seconds sous-dossiers nommés tif_pdf_various_names contiennent des fichiers tiff enregistrés à l'origine scannés (jusqu'à 200 pages), leurs fichiers PDF non modifiés et un brouillon de liste de contenu .docx - donc une collection de travail à domicile. J'avais besoin de faire une collection des 410 dossiers contenant uniquement le matériel finalement édité - avec les tiffs proches de 4 To. La méthode la plus simple trouvée était d'utiliser (dans Micr
Jurie

Réponses:

155

Si le répertoire cible est vide, utilisez find, filtrez avec uniquement les répertoires, filtrez par nom, exécutez rmdir:

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

Si vous souhaitez supprimer récursivement son contenu, remplacez-le -exec rmdir {} \;par -deleteou -prune -exec rm -rf {} \;. D'autres réponses incluent des détails sur ces versions, créditez-les aussi.

pistache
la source
9
Pourriez-vous s'il vous plaît expliquer ce que {} \;fait?
winklerrr
6
{}peut être lu comme "pour chaque fichier / dossier correspondant" - c'est-à-dire qu'il remplace chaque fichier / dossier "trouvé". \;est un terminateur pour la -execclause.
wmorrison365
2
Cela me donne une erreur "impossible de supprimer" lorsque le répertoire n'est pas vide
blindeyes
1
Pensez à ajouter un -pruneindicateur à la réponse selon la suggestion de @David Grayson. Sans cela, findessaiera toujours de visiter le dossier maintenant manquant et finira par quitter avec un code d'erreur, ce qui peut par exemple échouer une construction de Docker.
Czyzby
160

Utilisez find pour le nom "a" et exécutez rm pour supprimer ceux nommés selon vos souhaits, comme suit:

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

Testez-le d'abord en utilisant ls pour lister:

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

Pour vous assurer que cela ne supprime que les répertoires et non les fichiers simples, utilisez l'argument "-type d" (comme suggéré dans les commentaires):

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

Le "{}" est une substitution pour chaque fichier "a" trouvé - la commande exec est exécutée contre chacun par substitution.

wmorrison365
la source
4
Vous voudrez probablement y ajouter un "-type d" juste au cas où un fichier correspondrait au même nom.
Mark Loeser
3
Notez également que cela attrapera quelque chose comme 1/2/a/3/4, ce qui n'est peut-être pas prévu, donc +1 pour la recommandation de tester en premier ...
twalberg
9
reco echo {}pour le tester en premier, au lieu dels {}
Charney Kaye
2
Voici mon node_modules/.
saruftw
6
J'ai utilisé find . -name a -type d -exec rm -rf {} \;et cela a fonctionné, bien qu'il soit imprimé find: ‘./subdir/subdir/a’: No such file or directorypour chaque répertoire supprimé.
pacoverflow
59

Cela fonctionne également - cela supprimera tous les dossiers appelés «a» et leur contenu:

rm -rf `find -type d -name a`
Arash Fotouhi
la source
@Buffalo, comment ça se fait? Cette defo fonctionne mais les autres aussi. Je serais surpris de trouver un environnement où cela fonctionne mais les autres ne donnent pas toutes les réponses sont essentiellement find/rm.
wmorrison365
4
@ wmorrison365 parce que si vous le faites find . -name a -exec rm -rf {} \;, find plantera lorsqu'il essaiera d'entrer dans ce répertoire pour rechercher plus d'éléments, vous donnant une erreur comme find: '1/2/3/a': No such file or directory.
Alex Grönholm
@Alex Grönholm bien sûr, mais tous les dossiers nommés «a» sont néanmoins supprimés. Comme vous le dites, find ne peut pas par la suite chercher dans un dossier «a» supprimé mais cela n'a pas d'importance. Vouloir conserver le contenu de «a» pour un traitement ultérieur avant la suppression est un cas d'utilisation différent de ce que l'OP a demandé.
wmorrison365
6
@ wmorrison365 Oui, les répertoires sont supprimés mais je ne pense pas qu'il soit bon de recommander une solution où la commande échoue (retourne un code de sortie différent de zéro).
Alex Grönholm
1
Cela me donnait une erreur illegal option --t. Je devais passer aussi le répertoire pour rechercher dans ( stackoverflow.com/questions/25840713/... ): rm -rf `find . -type d -name a`.
Steve Harrison
25

Pour supprimer tous les répertoires avec le nom foo, exécutez:

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

Il manque une chose importante aux autres réponses: l' -pruneoption. Sans -prune, GNU find supprimera le répertoire avec le nom correspondant, puis essaiera de rentrer dedans pour trouver plus de répertoires qui correspondent. L' -pruneoption lui dit de ne pas rentrer dans un répertoire qui correspond aux conditions.

David Grayson
la source
21

J'ai fini par chercher ici à supprimer mes node_modulesdossiers avant de faire une sauvegarde de mon travail en cours en utilisant rsync. Une condition clé est que le node_modulesdossier puisse être imbriqué, vous avez donc besoin de l' -pruneoption.

J'ai d'abord exécuté ceci pour vérifier visuellement les dossiers à supprimer:

find -type d -name node_modules -prune

Ensuite, j'ai couru ceci pour les supprimer tous:

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

Merci à la pistache

mpalumbo7
la source
Ahh cela a bien fonctionné, pour en faire quelque chose que vous pourriez utiliser avec facilité, vous pouvez l'enregistrer comme un petit script shellscript: 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

Devrait faire l'affaire. ATTENTION, si vous pompez accidentellement un .ou /dans xargs rm -Rftout votre ordinateur sera supprimé sans option pour le récupérer, nécessitant une réinstallation du système d'exploitation.

Slevin
la source
2
Oh, juste ce petit risque minuscule. Est-ce tout? Haha. Super merci pour l'avertissement. Je ferais certainement cette erreur de frappe.
TinkerTenorSoftwareGuy
9

J'avais plus de 100 fichiers comme

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

les réponses ci-dessus n'ont pas fonctionné pour moi

mais la commande suivante m'a aidé.

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

j'ai donné -typecomme .si cela supprime les fichiers et les dossiers qui commencent parlog-

et rm -rfsupprime les dossiers de manière récursive même s'il contient des fichiers.

si vous voulez des dossiers seuls

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

fichiers seuls

find -type f -name "log-*" -exec rm  -rf {} \;
Thamaraiselvam
la source
8

En combinant plusieurs réponses, voici une commande qui fonctionne à la fois sous Linux et MacOS

rm -rf $(find . -type d -name __pycache__)
Marcosfede
la source
Un seul qui a fonctionné pour moi et qui
n'a
7

Un autre:

"-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
la source
3
Cette réponse ne fonctionne que pour les dossiers vides. -deletene supprime pas les dossiers non vides.
maninak
Merci d'avoir ajouté la version OSX
schu34
6

Cette commande fonctionne pour moi. Il fait son travail récursivement

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

. - dossier en cours

"node_modules" - nom du dossier

1nstinct
la source
-2

trouver le chemin / vers / les / dossiers -maxdepth 1 -name "my_ *" -type d -delete

PickleRick
la source