Comment utiliser la commande find pour supprimer les fichiers correspondant à un modèle?


17

J'essaie d'écrire une commande bash qui supprimera tous les fichiers correspondant à un modèle spécifique - dans ce cas, ce sont tous les anciens fichiers journaux vmware qui se sont accumulés.

J'ai essayé cette commande:

find . -name vmware-*.log | xargs rm

Cependant, lorsque j'exécute la commande, elle s'étouffe sur tous les dossiers qui ont des espaces dans leurs noms. Existe-t-il un moyen de formater le chemin du fichier afin que xargs le passe à rm entre guillemets ou correctement échappé?


Réponses:


20

Je trouve généralement que l'utilisation de l' -execoption pour findêtre plus facile et moins confuse. Essaye ça:

find . -name vmware-*.log -exec rm -i {} \;

Tout ce qui suit -execest considéré comme une commande à exécuter pour chaque résultat, jusqu'à la ;, qui est échappé ici afin qu'il soit transmis à find. Le {}est remplacé par le nom de fichier qui finds'imprime normalement.

Une fois que vous avez vérifié qu'il fait ce que vous voulez, vous pouvez supprimer le -i.


1
De plus, s'il s'agit uniquement de fichiers que vous souhaitez supprimer et non de répertoires, vous pouvez ajouter '' -type f '' à la commande find.
JamesHannah

18

Si vous avez GNU, findvous pouvez utiliser l' -deleteoption:

find . -name "vmware-*.log" -delete

Pour utiliser xargset éviter le problème avec les espaces dans les noms de fichiers:

find . -name vmware-*.log -print0 | xargs -0 rm

Cependant, vos fichiers journaux ne doivent pas avoir d'espaces dans leurs noms. Les documents de traitement de texte et les fichiers MP3 sont susceptibles de les avoir, mais vous devriez pouvoir contrôler les noms de vos fichiers journaux.


C'est bien. Je n'en savais rien.
Jeff Snider

8

Vous pouvez dire findde délimiter la liste de sortie avec des valeurs NULL et xargsde recevoir la même liste d'entrée:

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

Assurez-vous également que vous échappez à la *, soit avec une barre oblique inverse, soit en contenant les vmware-*.logguillemets simples, sinon votre shell peut essayer de la développer avant de la passer find.


6

N'oubliez pas l' -deleteoption de trouver . Il supprime le fichier sans erreur avec des caractères spéciaux ...

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.