« Exécuter des commandes sur plusieurs fichiers : find -exec vs find xargs » : différence entre les versions

Aller à la navigation Aller à la recherche
Aucun résumé des modifications
 
(10 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
[[Category:Linux]]
[[Category:serveur]]
[[Category:serveur]]
[[Category:desktop]]
[[Category:desktop]]
[[Category:outils]]
[[Category:tools]]


=find -exec=
==find \;==
<pre>
find . [args] -exec [cmd] {} \;
find . -name \*.html -type f -exec grep -Hn 'pattern' {} \;
</pre>
* <code>{}</code> contiendra le résultat trouvé par find
* <code>\;</code> signifie que pour chaque résultat trouvé par find, la commande (grep dans l'exemple) sera exécuté une fois sur le résultat trouvé
** Donc si find trouve 4000 fichiers, la commande (grep ici) sera exécutée 4000 fois.
==find \+==
<pre>
find . [args] -exec [cmd] {} \+
find . -name \*.html -type f -exec grep -Hn 'pattern' {} \+
</pre>


=find -exec=
* <code>{}</code> contiendra le résultat trouvé par find
* <code>\+</code> tous les résultats trouvés par find sont mergés et la commande (grep ici) n'est exécutée qu'une seule fois avec tous les résultats de find.
** Inconvénient possible : si find trouve beaucoup de résultat, vous allez finir par atteindre ARG_LIMIT


=find | xargs=
=find | xargs=
==xargs avec -n1==
<pre>
find .[args] -print0 | xargs -0 -n1 [cmd]
find . -name \*.html -type f -print0 | xargs -0 -n1 grep -Hn 'pattern'
</pre>
* <code>-print0</code> spécifie à find qu'il doit retourner les résultats à la sortie standard, séparés par le caractère ASCII nul <code>\000</code>
* <code>-0</code> spécifie à xargs que l'entrée qu'il reçoit est séparé par le caractère ASCII nul <code>\000</code>
* <code>-n1</code> demande à xargs d’exécuter la commande avec un seul argument à la fois (dans le cas présent, avec un seul fichier trouvé par find). Cela est similaire au <code>\;</code> de <code>-exec</code>. La commande est donc exécutée autant de fois qu'il y a de fichier trouvé par find.
** On peut modifier 1 par n'importe quelle valeur
==xargs sans -n==
<pre>
find . [args] -print0 | xargs -0 [cmd]
find . -name \*.html -type f -print0 | xargs -0 grep -Hn 'pattern'
</pre>
* <code>-print0</code> spécifie à find qu'il doit retourner les résultats à la sortie standard, séparés par le caractère ASCII nul <code>\000</code>
* <code>-0</code> spécifie à xargs que l'entrée qu'il reçoit est séparé par le caractère ASCII nul <code>\000</code>
* Quand on ne spécifie pas <code>-nINT</code>, xargs utilise le défaut <code>-n5000</code>. Cela signifie donc que la commande est exécutée avec 5000 arguments maximums, donc dans le cas présent, avec 5000 fichiers à la fois (puis la commande est exécutée  une seconde fois avec les 5000 fichiers suivants, etc). Cela est similaire avec le <code>+;</code> de <code>-exec</code>, néanmoins sans risque de dépasser ARG_LIMIT, ni une limite arbitraire fixée par la commande que vous exécutez.
==caractère ASCII nul \000==
Le caractère ASCII nul <code>\000</code> est une bonne manière de gérer les fichiers contenants des espaces
=performances=
Globalement, <code>xargs -n1</code> est légèrement plus rapide que <code>\;</code>, et <code>xargs -n5000</code> a une vitesse similaire à <code>\+</code>
Notez que <code>xargs</code> peut se paralléliser avec <code>-PINT</code> (généralement -P4 ou -P8 selon le nombre de cœur de votre processeur), ce qui en augmentera les performances que ce soit avec -n1 ou sans.<br>
Rappelez vous que l'intérêt de paralléliser une commande traitant des fichiers n'augmentera les performances que si vous devez appliquer une commande à un nombre important de petits fichiers. Si vous traitez de gros fichiers, la vitesse de votre disque deviendra le facteur limitant et vous perdrez très vite les bénéfices de la parallélisation.
=Différence à noter=
* <code>find -exec</code> retourne l'exit-code de find et pas celui de la sous-commande.
* <code>find | xargs</code> retourne l'exit-code de la sous-commande.
4 231

modifications

Menu de navigation