4 231
modifications
Aucun résumé des modifications |
|||
(9 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]] | ||
Ligne 4 : | Ligne 5 : | ||
=find -exec= | =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> | |||
* <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. |