11
votes

Script Shell: Utilisation de bash avec Xargs

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 ont construit.

J'ai essayé cette commande: < / p> xxx

Cependant, lorsque j'exécute la commande, il étouffe tous les dossiers qui ont des espaces dans leurs noms. Existe-t-il un moyen de formater le chemin de fichier pour que Xargs le transmet à RM cité ou correctement échappé?


1 commentaires

7 Réponses :


5
votes

Consultez le drapeau -0 code> pour xargs code>; combiné avec trouver code> 's -print0 code> Vous devez être défini.

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


0 commentaires

23
votes

Essayez d'utiliser:

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


0 commentaires

9
votes

Ne pas utiliser Xargs. Trouver peut le faire sans aide:

trouver. -Name "VMware - *. LOG" -EXEC RM '{}' \;


6 commentaires

Il est toujours bon d'éviter de commencer un processus supplémentaire, en particulier quelque chose comme ça où vous pourriez fournir quelque chose de trop long à Xargs. Notez que Recherche a une action Supprimer Action que vous pouvez utiliser au lieu du -exec ... - mais il est plus facile de personnaliser de cette façon. Vous n'avez pas non plus à citer les accolades frisées, à moins que vous n'utilisiez une vieille coquille comme TCSH.


Mais cela lancera un processus RM pour chaque fichier individuellement, au lieu de passer plusieurs noms de fichiers à RM comme xargs fait, donc ça va être plus lent. .


@JK: C'est la raison pour laquelle la nouvelle Les implémentations ont Rechercher -exec rm '{}' + , qui lottera des arguments libéraux comme xargs .


@JK: Vous avez raison sur les processus. Quant à la vitesse, il y a toujours des exceptions, mais dans mon expérience, ce n'est pas le processus de traitement de la RM qui domine. Si vous supprimez suffisamment de fichiers que l'heure RM gagne, c'est l'activité de disque réelle qui vous tiendrai. Sinon, c'est le moment de la recherche qui compte de toute façon (penser 5 correspond à 10000 fichiers).


@Efement: Bon appel. Je l'oublierais totalement!


@Efement: Merci, je ne savais pas à ce sujet!



4
votes

gnu trouve xxx


0 commentaires

1
votes

trouver. -Name VMware - *. Connexion | xargs -i rm -rf {}


0 commentaires

0
votes
find -iname pattern
use -iname for pattern search

0 commentaires

0
votes

Pour éviter le problème de l'espace dans Xargs, j'utiliserais un nouveau caractère de ligne en tant que séparateur avec option -D: xxx


0 commentaires