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.
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
.)
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.
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
Vous pouvez également utiliser l'option -exec
find . -name test -exec rm {} \;
Supposons que vous utilisez gnu find , vous pouvez utiliser l'option -delete:
find . -name test -delete
ce qui est plus facile à retenir.
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
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
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/