Recherchez et supprimez tous les répertoires nommés «test» sous linux


35

J'ai de nombreux 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 supprimer les répertoires?


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

Réponses:


70

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 permet rm -rde supprimer le répertoire et tous ses enfants.

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

-print0indique findd'imprimer des \0caractères au lieu de nouvelles lignes; et -0indique xargsde ne traiter que \0comme séparateur d'arguments.

Ceci appelle rmavec de nombreux répertoires à la fois, évitant ainsi la surcharge d'appels rmséparément pour chaque répertoire.


Vous findpouvez é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 rmavec plusieurs répertoires à la fois :

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

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


1
Excellente réponse, en particulier la +recherche in. Je n'en avais aucune idée, j'aurais vraiment souhaité l'avoir su il y a longtemps.
Scott

attention à la dernière commande, elle a en quelque sorte supprimé certains fichiers. la xargscommande a bien fonctionné.
Henrique de Sousa

23
find /path/to/dir -name "test" -type d -delete
  • -name: recherche le nom passé. Vous pouvez utiliser -regexpour fournir des noms basés sur des expressions régulières

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

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

Alternativement:

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

Comme JF Sebastian l'a déclaré dans les commentaires:

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


1
Désolé, j'ai oublié de mentionner que ces répertoires peuvent contenir des fichiers. Je n'ai pas pu supprimer certains d'entre eux à cause de l'erreur "find: can't delete` ./start ': Directory not empty "
garbage collection

@garbagecollection J'ai ajouté une mise à jour.
jaypal singh

3
vous pouvez utiliser +au lieu de \;passer plusieurs répertoires à la fois.
jfs

Merci @JFSebastian Bon point. Je vais l'ajouter à la réponse.
jaypal singh


5

Vous pouvez également utiliser l'option -exec

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

3

En supposant que bash 4+

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

La barre oblique de fin signifie qu'elle ne correspondra qu'aux répertoires. Le test est préalable avec:

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

2

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

find . -name test -delete

ce qui est plus facile à retenir.


2

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

find -name "test" -type d -delete

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

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

Dans les deux cas cependant, si l'un des répertoires nommés testcontient des fichiers, il findse plaindra de cela Directory is not emptyet ne supprimera pas le répertoire.

Si vous aviez l'intention de supprimer tous les fichiers, y compris le testrépertoire, nous pouvons utiliser la même astuce pour supprimer tous les fichiers dans les répertoires nommés en testpremier.

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

Le modèle "*/test/*":, garantira que nous ne supprimons que les fichiers dans un répertoire nommé /test/. Une fois les répertoires vides, nous pouvons continuer et supprimer les répertoires à l'aide de 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 utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.