Quelle est l'utilisation de -exec xargs et -print0?

20

Je pense que ce sont les moyens courants de passer le résultat d'une commande à la suivante, en tant qu'entrées.

Comment fonctionnent ces trois? Ou quels sont certains sites Web / URL?

James Bond
la source

Réponses:

25

Premières choses à taper:

man find

man xargs

La findcommande imprime les résultats sur la sortie standard par défaut, donc l' -printoption n'est normalement pas nécessaire, mais -print0sépare les noms de fichiers par un octet 0 (NULL) afin que les noms contenant des espaces ou des retours à la ligne puissent être interprétés correctement.

L' -execoption est quelque chose que vous pouvez utiliser à la place de xargs - la commande find exécute une commande pour chaque élément qu'il trouve.

La xargscommande lit les chaînes séparées par des espaces ou des sauts de ligne (généralement à partir de la commande find , mais elles peuvent provenir de n'importe où) et exécute une commande pour chaque chaîne.
Si xargs est exécuté avec une option -0 , il attendra des chaînes séparées par NULL en sortie parfind ... -print0

L'avantage de xargs est qu'il peut regrouper les chaînes, de sorte qu'il n'exécute une commande qu'une ou deux fois au lieu de n fois.

Donc, dans l'utilisation normale:

find start_directory -name '*.txt' | xargs ls -l 

find listerait les noms de fichiers et xargs émettrait des commandes comme:

ls -l file1.txt file2.txt file3.txt ... fileN.txt

ce qui est plus rapide que l'émission de votre commande find:

ls -l file1.txt
ls -l file2.txt
ls -l file3.txt
ls -l ...
ls -l fileN.txt
njd
la source
7

Notez que xargs n'est plus nécessaire avec les implémentations de recherche actuelles qui prennent probablement toutes en charge cette syntaxe POSIX:

find directory -name '*.txt' -exec ls -l {} + 

ce qui est plus simple et légèrement plus rapide que la variante xargs.

find directory -name '*.txt' | xargs ls -l 
jlliagre
la source
xargs utilise beaucoup moins de ressources que 'find -exec'
Felipe Alvarez
7
C'est l'inverse. Le piping vers xargs utilisera un peu plus de ressources que -exec. Vous oubliez probablement le terminateur "+".
jlliagre