284 votes

Ignorer résultat vide pour xargs

Considérer cette commande:

ls /mydir/*.txt | xargs chown root

L'intention est de changer de propriétaire de tous les fichiers texte en mydir à la racine

Le problème est que si il n'y a aucun .txt fichiers en mydir alors xargs thows une erreur disant qu'il y a pas de chemin d'accès spécifié. C'est un inoffensif exemple parce qu'une erreur est levée, mais dans certains cas, comme dans le script que j'ai besoin d'utiliser ici, un chemin vide est supposé être le répertoire courant. Donc, si je exécuter cette commande à partir d' /home/tom/ puis si il n'y a pas de résultat pour ls /mydir/*.txt et tous les fichiers dans /home/tom/ leurs propriétaires changé à la racine.

Alors, comment puis-je avoir xargs ignorer un résultat vide?

499voto

Sven Marnach Points 133943

Utiliser l' -r ou --no-run-if-empty option:

--no-run-if-empty
-r
Si l'entrée standard ne contient pas non vides, ne pas exécuter la commande. Normalement, la commande est exécutée une seule fois, même si il n'y a pas d'entrée. Cette option est une extension GNU.

18voto

arielCo Points 128

Les utilisateurs de non-GNU xargs peut prendre avantage de l' -L <#lines>, -n <#args>, -i, et -I <string>:

ls /empty_dir/ | xargs -n10 chown root   # chown executed every 10 args
ls /empty_dir/ | xargs -L10 chown root   # chown executed every 10 lines
ls /empty_dir/ | xargs -i cp {} {}.bak   # every {} is replaced with the args from one input line
ls /empty_dir/ | xargs -I ARG cp ARG ARG.bak # like -i, with a user-specified placeholder

Gardez à l'esprit que xargs divise la ligne à l'espace, mais en les citant et d'échappement sont disponibles; RTFM pour plus de détails.

11voto

thiton Points 21303

man xargs , dit - --no-run-if-empty.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X