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?
Réponses:
Si le répertoire cible est vide, utilisez find, filtrez avec uniquement les répertoires, filtrez par nom, exécutez rmdir:
Si vous souhaitez supprimer récursivement son contenu, remplacez-le
-exec rmdir {} \;
par-delete
ou-prune -exec rm -rf {} \;
. D'autres réponses incluent des détails sur ces versions, créditez-les aussi.la source
{} \;
fait?{}
peut être lu comme "pour chaque fichier / dossier correspondant" - c'est-à-dire qu'il remplace chaque fichier / dossier "trouvé".\;
est un terminateur pour la-exec
clause.-prune
indicateur à la réponse selon la suggestion de @David Grayson. Sans cela,find
essaiera 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.Utilisez find pour le nom "a" et exécutez rm pour supprimer ceux nommés selon vos souhaits, comme suit:
Testez-le d'abord en utilisant ls pour lister:
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):
Le "{}" est une substitution pour chaque fichier "a" trouvé - la commande exec est exécutée contre chacun par substitution.
la source
1/2/a/3/4
, ce qui n'est peut-être pas prévu, donc +1 pour la recommandation de tester en premier ...echo {}
pour le tester en premier, au lieu dels {}
node_modules/
.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 directory
pour chaque répertoire supprimé.Cela fonctionne également - cela supprimera tous les dossiers appelés «a» et leur contenu:
la source
find/rm
.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 commefind: '1/2/3/a': No such file or directory
.illegal option --t
. Je devais passer aussi le répertoire pour rechercher dans ( stackoverflow.com/questions/25840713/... ):rm -rf `find . -type d -name a`
.Pour supprimer tous les répertoires avec le nom
foo
, exécutez:Il manque une chose importante aux autres réponses: l'
-prune
option. 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'-prune
option lui dit de ne pas rentrer dans un répertoire qui correspond aux conditions.la source
J'ai fini par chercher ici à supprimer mes
node_modules
dossiers avant de faire une sauvegarde de mon travail en cours en utilisantrsync
. Une condition clé est que lenode_modules
dossier puisse être imbriqué, vous avez donc besoin de l'-prune
option.J'ai d'abord exécuté ceci pour vérifier visuellement les dossiers à supprimer:
Ensuite, j'ai couru ceci pour les supprimer tous:
Merci à la pistache
la source
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
Devrait faire l'affaire. ATTENTION, si vous pompez accidentellement un
.
ou/
dansxargs rm -Rf
tout votre ordinateur sera supprimé sans option pour le récupérer, nécessitant une réinstallation du système d'exploitation.la source
J'avais plus de 100 fichiers comme
les réponses ci-dessus n'ont pas fonctionné pour moi
mais la commande suivante m'a aidé.
j'ai donné
-type
comme.
si cela supprime les fichiers et les dossiers qui commencent parlog-
et
rm -rf
supprime les dossiers de manière récursive même s'il contient des fichiers.si vous voulez des dossiers seuls
fichiers seuls
la source
En combinant plusieurs réponses, voici une commande qui fonctionne à la fois sous Linux et MacOS
la source
Un autre:
la source
-delete
ne supprime pas les dossiers non vides.Cette commande fonctionne pour moi. Il fait son travail récursivement
. - dossier en cours
"node_modules" - nom du dossier
la source
trouver le chemin / vers / les / dossiers -maxdepth 1 -name "my_ *" -type d -delete
la source