41 votes

Trouver et supprimer tous les répertoires nommés "test" dans Linux

J'ai plusieurs répertoires nommés "test" et je voudrais les supprimer.

Je sais comment les trouver et les afficher en utilisant:

find . -name test -print

Maintenant, comment puis-je supprimer les répertoires?


Veuillez noter que j'ai aussi des fichiers dans le répertoire et ils doivent également être supprimés.

87voto

joe Points 1

xargs fait toute la magie:

find . -name test -type d -print0|xargs -0 rm -r --

xargs exécute la commande passée en paramètres, avec les arguments passés à stdin.

Cela utilise rm -r pour supprimer le répertoire et tous ses enfants.

Le -- indique la fin des arguments, pour éviter qu'un chemin commençant par - ne soit traité comme un argument.

-print0 indique à find d'imprimer les caractères \0 au lieu des sauts de ligne; et -0 indique à xargs de traiter uniquement \0 comme séparateur d'arguments.

Ceci appelle rm avec de nombreux répertoires à la fois, évitant le surcoût d'appeler rm séparément pour chaque répertoire.


En alternative, find peut également exécuter une commande pour chaque fichier sélectionné:

find . -name test -type d -exec rm -r {} \;

Et celui-ci, avec de meilleures performances, car il appellera rm avec plusieurs répertoires en une seule fois:

find . -name test -type d -exec rm -r {} +

(Remarquez le + à la fin; celui-ci est équivalent à la solution avec xargs.)

25voto

Matt Points 381
trouver /chemin/vers/répertoire -name "test" -type d -delete
  • -name: recherche le nom spécifié. Vous pouvez utiliser -regex pour fournir des noms basés sur des expressions régulières

  • -type: recherche les types de fichiers. d recherche uniquement les répertoires

  • -delete: action qui supprime la liste trouvée.

Alternativement:

trouver /chemin/vers/répertoire -name "test" -type d -exec rm -rf {} \;

Comme l'a indiqué J.F. Sebastian dans les commentaires:

Vous pouvez utiliser + au lieu de \; pour passer plus d'un répertoire à la fois.

8voto

maazza Points 446

Une autre façon de faire cela est

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

Un lien utile sur find: http://www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml

5voto

sethi Points 151

Vous pouvez également utiliser l'option -exec

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

3voto

evilsoup Points 12077

En supposant bash 4+

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

Le slash final signifie qu'il ne correspondra qu'aux répertoires. Testez-le au préalable avec :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X