2009-10-19 5 views
11

J'essaye d'écrire une commande bash qui va supprimer tous les fichiers correspondant à un modèle spécifique - dans ce cas, c'est tous les anciens fichiers journaux vmware qui se sont accumulés.Shell scripting: Utilisation de bash avec xargs

J'ai essayé cette commande:

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

Cependant, quand je lance la commande, il selfs 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 quoted ou correctement échappé?

+0

Cross affichée: http://serverfault.com/questions/76031/shell-scripting-using-find-to-delete-files-matching-a-pattern –

Répondre

24

Essayez d'utiliser:

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

Cela provoque trouver la sortie d'un caractère nul après chaque nom de fichier et indique xargs pour briser des noms basés sur des caractères nuls au lieu de jetons ou d'autres espaces.

5

Consultez le drapeau -0 pour xargs; combiné avec find-print0 vous devriez être défini.

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

N'utilisez pas xargs. Trouver peut le faire sans aide:

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

+3

Il est toujours bon pour éviter de commencer un processus supplémentaire, surtout quelque chose comme ceci où vous pourriez fournir quelque chose de trop long à xargs. Notez que 'find' a même une action' delete' que vous pouvez utiliser à la place de '-exec ...', mais il est plus facile de le personnaliser. Vous n'avez pas non plus à citer les accolades, sauf si vous utilisez un ancien shell comme tcsh. – Cascabel

+3

Mais cela va lancer un processus 'rm' pour chaque fichier individuellement, au lieu de passer plusieurs noms de fichiers à' rm' comme le fait 'xargs', donc ça va être plus lent. – JaakkoK

+5

@jk: C'est pourquoi les nouvelles implémentations 'find' ont' find -exec rm '{}' + ', ce qui permet de charger des arguments comme le fait' xargs'. – ephemient

4

trouver GNU

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

find . -name vmware-*.log | xargs -i rm -rf {}

0
find -iname pattern 

utilisation -iname pour la recherche de modèle

0

Pour éviter problème de l'espace dans xargs I utiliser un nouveau caractère de ligne comme sep arator avec option -d:

find . -name vmware-*.log | xargs -d '\n' rm