Quelle est la difference entre xargs et exec?


Réponse 1:

xargs lit à partir de stdin (en utilisant vide comme livraison pour les jetons) et exécute les commandes; pour chaque ligne lue à partir de l'entrée standard, il exécute une commande en utilisant un argument initial (options) suivi par les jetons lus.

exec remplacera le shell par un autre processus. Si vous connaissez excel (), execv () et vos amis, c'est vraiment ce qu'il fait.


Réponse 2:

Généralement, cela se résume au nombre de fork / clones qui sont exécutés (efficacité), mais a également des implications pour les arguments des commandes. Prenons cet exemple.

trouver / etc -type f -print -exec stat

contre

trouver / etc -type f -print | xargs stat

On pourrait être tenté de penser que la première est plus efficace car si c'est une commande, mais ce n'est pas le cas et voici pourquoi. Le premier exécutera la commande «stat» pour chaque fichier trouvé dans / etc. Il en résulte un fork / clone et un exec pour chaque fichier. Le second regroupera tout un tas de noms de fichiers et les transmettra à la commande stat en groupes (vous pouvez modifier le nombre de fichiers dans un groupe avec des arguments xargs). Il en résulte 1 / appels fork / exec où est le nombre d'arguments d'entrée que xargs a décidé de passer à stat.

Limitation importante: si vous prévoyez d'utiliser xargs avec des commandes qui ne peuvent accepter qu'un seul argument (mv, scp et rsync ont ici des implications intéressantes), vous voudrez probablement faire xargs -n 1, auquel cas vous avez peut-être utilisé -exec et a eu le même résultat net.

(voir aussi find. -print0 | xargs -0 si vous avez des espaces ou d'autres caractères géniaux dans vos noms de fichiers)