« Exécuter des commandes sur plusieurs fichiers : find -exec vs find xargs » : différence entre les versions
Aller à la navigation
Aller à la recherche
Ligne 28 : | Ligne 28 : | ||
=find | xargs= | =find | xargs= | ||
==xargs avec -n1== | |||
<pre> | |||
find .[args] -print0 | xargs -0 -n1 [cmd] | |||
</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] | |||
</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. |
Version du 27 juillet 2022 à 01:21
find -exec
find \;
find . [args] -exec [cmd] {} \; find . -name \*.html -type f -exec grep -Hn 'pattern' {} \;
{}
contiendra le résultat trouvé par find\;
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 \+
find . [args] -exec [cmd] {} \+ find . -name \*.html -type f -exec grep -Hn 'pattern' {} \+
{}
contiendra le résultat trouvé par find\+
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
xargs avec -n1
find .[args] -print0 | xargs -0 -n1 [cmd]
-print0
spécifie à find qu'il doit retourner les résultats à la sortie standard, séparés par le caractère ASCII nul\000
-0
spécifie à xargs que l'entrée qu'il reçoit est séparé par le caractère ASCII nul\000
-n1
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\;
de-exec
. 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
find . [args] -print0 | xargs -0 [cmd]
-print0
spécifie à find qu'il doit retourner les résultats à la sortie standard, séparés par le caractère ASCII nul\000
-0
spécifie à xargs que l'entrée qu'il reçoit est séparé par le caractère ASCII nul\000
- Quand on ne spécifie pas
-nINT
, xargs utilise le défaut-n5000
. 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+;
de-exec
, néanmoins sans risque de dépasser ARG_LIMIT, ni une limite arbitraire fixée par la commande que vous exécutez.