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é?

Dan Monego
la source
Post-cross: stackoverflow.com/questions/1590297/…
pause jusqu'à nouvel ordre.

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.

Jeff Snider
la source
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.

En pause jusqu'à nouvel ordre.
la source
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.

James Sneeringer
la source
6

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

Dom
la source