• [^] # Re: Merci

    Posté par (site web personnel) . En réponse au journal Des "basheries". Évalué à 6. Dernière modification le 01 décembre 2016 à 14:40.

    plutôt qu'un print pour un xarg; autant attaquer directement le fichier.

    ça coûte pas le même prix.

    $ for i in $(seq 1 10) ; do echo coin > $i ; done # 10 fichiers contenant "coin"
    $ strace -f -o "|grep execve" -e execve find . -type f -exec /bin/grep -s coin {} >/dev/null \;
    15273 execve("/usr/bin/find", ["find", ".", "-type", "f", "-exec", "/bin/grep", "-s", "coin", "{}", ";"], [/* 67 vars */]) = 0
    15275 execve("/bin/grep", ["/bin/grep", "-s", "coin", "./1"], [/* 67 vars */]) = 0
    15276 execve("/bin/grep", ["/bin/grep", "-s", "coin", "./7"], [/* 67 vars */]) = 0
    15277 execve("/bin/grep", ["/bin/grep", "-s", "coin", "./10"], [/* 67 vars */]) = 0
    15278 execve("/bin/grep", ["/bin/grep", "-s", "coin", "./3"], [/* 67 vars */]) = 0
    15279 execve("/bin/grep", ["/bin/grep", "-s", "coin", "./4"], [/* 67 vars */]) = 0
    15280 execve("/bin/grep", ["/bin/grep", "-s", "coin", "./2"], [/* 67 vars */]) = 0
    15281 execve("/bin/grep", ["/bin/grep", "-s", "coin", "./9"], [/* 67 vars */]) = 0
    15282 execve("/bin/grep", ["/bin/grep", "-s", "coin", "./6"], [/* 67 vars */]) = 0
    15283 execve("/bin/grep", ["/bin/grep", "-s", "coin", "./8"], [/* 67 vars */]) = 0
    15284 execve("/bin/grep", ["/bin/grep", "-s", "coin", "./5"], [/* 67 vars */]) = 0
    $ strace -f -o "|grep execve" -e execve find . -type f -exec /bin/grep -s coin {} +
    15661 execve("/usr/bin/find", ["find", ".", "-type", "f", "-exec", "/bin/grep", "-s", "coin", "{}", "+"], [/* 67 vars */]) = 0
    15663 execve("/bin/grep", ["/bin/grep", "-s", "coin", "./1", "./7", "./10", "./3", "./4", "./2", "./9", "./6", "./8", "./5"], [/* 67 vars */]) = 0
    $ strace -f -o "|grep execve" -e execve sh -c "find . -type f -print0|xargs -0 /bin/grep -sh coin"
    15393 execve("/bin/sh", ["sh", "-c", "find . -type f -print0|xargs -0 "...], [/* 67 vars */]) = 0
    15395 execve("/usr/bin/find", ["find", ".", "-type", "f", "-print0"], [/* 67 vars */] <unfinished ...>
    15396 execve("/usr/bin/xargs", ["xargs", "-0", "/bin/grep", "-sh", "coin"], [/* 67 vars */] <unfinished ...>
    15397 execve("/bin/grep", ["/bin/grep", "-sh", "coin", "./1", "./7", "./10", "./3", "./4", "./2", "./9", "./6", "./8", "./5"], [/* 67 vars */] <unfinished ...>

    donc onze processus (un find et 10 grep), deux (find, grep) ou trois (un find, un xargs et un grep) suivant les cas.

    Remarque: le nombre de grep dans le 3e cas peut augmenter suivant les limites d'xargs et du shell, mais il sera toujours largement inférieur au premier cas. Et on peut avoir des pièges comme le "|xargs tar cvf" qui est à proscrire.