web-dev-qa-db-fra.com

Trouvez et supprimez tous les répertoires nommés "test" sous linux

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

Je sais comment les trouver et les imprimer en utilisant:

find . -name test -print

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


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

33

xargs fait toute la magie:

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

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

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

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

-print0 indique find pour imprimer \0 caractères au lieu de nouvelles lignes; et -0 indique à xargs de ne traiter que \0 en tant que séparateur d'arguments.

Ceci appelle rm avec plusieurs répertoires à la fois, évitant ainsi la surcharge d'appeler rm séparément pour chaque répertoire.


Sinon, 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, puisqu'il appellera rm avec plusieurs répertoires à la fois :

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

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

68
Arnaud Le Blanc
find /path/to/dir -name "test" -type d -delete
  • - name: recherche le nom transmis. Vous pouvez utiliser -regex pour fournir des noms basés sur des expressions régulières

  • - type: recherche les types de fichiers. d ne cherche que des répertoires

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

Sinon:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

Comme J.F. Sebastian a déclaré dans les commentaires:

Vous pouvez utiliser + au lieu de \; pour passer plusieurs répertoires à la fois.

23
jaypal singh

encore une autre façon de faire 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

7
maazza

Vous pouvez également utiliser l'option -exec

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

Supposons que vous utilisez gnu find , vous pouvez utiliser l'option -delete:

find . -name test -delete

ce qui est plus facile à retenir.

2
Chun Yang

Comme le souligne une autre réponse, vous pouvez essayer de trouver tous les répertoires portant le nom test et de les supprimer.

find -name "test" -type d -delete

J'ai rencontré des problèmes de compatibilité croisée sur Mac, alors j'ai utilisé cette commande équivalente:

find -path "*/test" -type d -delete
  • - path : recherche un motif dans le nom de fichier qualifié complet.

Dans les deux cas, toutefois, si l'un des répertoires nommés test contient des fichiers, find se plaindra du Directory is not empty et ne supprimera pas le répertoire.

Si vous aviez l'intention de supprimer tous les fichiers , y compris le répertoire test, vous pouvez utiliser le même truc pour supprimer tous les fichiers contenus dans les répertoires nommés test .

find -path "*/test/*" -delete

Le modèle: "*/test/*", garantira que nous ne supprimons les fichiers que dans un répertoire nommé /test/. Une fois que les répertoires sont vides, nous pouvons continuer et supprimer les répertoires en utilisant la première commande:

find -path "*/test" -type d -delete

Exemple:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

2 directories, 1 file
2
Karl

En supposant bash 4+

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

La barre oblique finale signifie qu'elle ne correspond qu'aux répertoires Le test est préalable avec:

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