supprimer tout un type de fichier d'un répertoire et de ses enfants

J'avais l'impression que

rm -r *.xml

Supprimerait tous les fichiers du parent et de l'enfant cependant:

*.xml: No such file or directory
26
demandé sur keyser 2011-08-17 20:48:17

6 réponses

La page de manuel de rm dit:

 -r, -R, --recursive
          remove directories and their contents recursively

Cela signifie que l'indicateur -r attend un répertoire. Mais *.xml n'est pas un répertoire.

Si vous voulez supprimer le tout .fichiers xml du répertoire courant récursivement ci-dessous est la commande:

find . -name "*.xml" -type f|xargs rm -f
42
répondu Vijay 2013-01-17 16:59:12

Je suppose que vous voulez supprimer tous les fichiers *.xml récursivement (dans les répertoires actuels et tous les sous-répertoires). Pour ce faire, utilisez find:

find . -name "*.xml" -exec rm {} \;

Sur une note de côté, la suppression récursive me fait peur. Sur mes jours plus sains, j'ai tendance à précéder cette étape avec:

find . -name "*.xml" 

(sans le bit -exec) juste pour voir ce qui pourrait être supprimé avant de faire le saut. Je vous conseille de faire la même chose. Vos fichiers vous remercieront.

26
répondu Shawn Chin 2012-05-04 21:21:13

En lisant cette réponse à la recherche de répertoires vides unix , je viens d'apprendre l'action-delete:

-delete
          Delete  files; true if removal succeeded.  If the removal failed, an error message is issued.  If -delete fails, find's exit status will be nonzero (when it even‐
          tually exits).  Use of -delete automatically turns on the -depth option.

          Warnings: Don't forget that the find command line is evaluated as an expression, so putting -delete first will make find try to delete everything below the start‐
          ing  points  you  specified.   When  testing a find command line that you later intend to use with -delete, you should explicitly specify -depth in order to avoid
          later surprises.  Because -delete implies -depth, you cannot usefully use -prune and -delete together.

Source: Homme trouver

Cela signifie que vous pouvez également supprimer tous les fichiers xml récursivement comme ceci:

find . -name "*.xml" -type f -delete
3
répondu madc 2017-05-23 12:26:07

Plus belle façon, bien que celle-ci soit moins supportée dans les systèmes unix:

rm -rf */*.xml

Cela supprimera les fichiers xml de tous les sous-répertoires de votre répertoire actuel.

3
répondu holms 2015-08-13 16:20:03

Zsh globbing récursif à la rescousse!

Invoquer zsh: zsh

Assurez-vous que vous êtes dans le répertoire dans lequel vous avez l'intention d'être: cd wherever

Liste en premier: ls **/*.xml

Supprimer: rm **/*.xml

Je vais résister à la forte tentation de bash sur bash, et juste pointer vers les documents zsh pertinents sur le sujet ici.

2
répondu mattmc3 2017-01-24 01:48:00

Un moyen facile de le faire est

Rm-f *.xml

Cela supprimera tout .fichiers xml du répertoire courant.

0
répondu Daga 2015-09-23 14:35:12