web-dev-qa-db-fra.com

trouver -exec + vs trouver | Xargs: lequel choisir?

Je comprends que le -exec peut prendre un + option pour imiter le comportement de xargs. Y a-t-il une situation où vous préféreriez une forme sur l'autre?

Personnellement, j'ai tendance à préférer la première forme, si seulement pour éviter d'utiliser un tuyau. Je pense que les développeurs de find ont dû faire les optimisations appropriées. Ai-je raison?

33
rahmu

Vous voudrez peut-être chaîner des appels pour trouver (une fois que vous avez appris que cela est possible, ce qui pourrait être aujourd'hui). Ceci est bien sûr que possible que possible tant que vous restez à la recherche. Une fois que vous avez conduit à Xargs, il est hors de portée.

Petit exemple, deux fichiers A.LST et B.LST:

cat a.lst
fuddel.sh
fiddel.sh

cat b.lst
fuddel.sh

Pas d'astuce ici - tout simplement le fait que les deux contiennent "Fuddel" mais un seul contient "Fiddel".

Supposons que nous ne le savions pas. Nous recherchons un fichier qui correspond à 2 conditions:

find -exec grep -q fuddel {} ";" -exec grep -q fiddel {} ";" -ls
192097    4 -rw-r--r--   1 stefan   stefan         20 Jun 27 17:05 ./a.lst

Eh bien, vous connaissez peut-être la syntaxe du GREP ou un autre programme de transmettre les deux cordes comme condition, mais ce n'est pas le point. Chaque programme pouvant retourner vrai ou faux, donné un fichier comme argument peut être utilisé ici - Grep n'était qu'un exemple populaire.

Et note, vous pouvez suivre trouver -exec avec d'autres commandes de recherche, comme LS ou Supprimer ou quelque chose de similaire . Remarque, qui supprime non seulement RM (supprime les fichiers), mais également RMDIR (supprime les répertoires) également.

Une telle chaîne est lue comme une combinaison de commandes, tant qu'autrement spécifié autrement (à savoir avec un -or commutateur (et parens (qui nécessitent un masquage)).

Donc, vous ne quittez pas la chaîne de recherche, qui est une chose pratique. Je ne vois aucun avantage à utiliser -Xargs, puisque vous devez faire attention à la réussite des fichiers, ce qui est quelque chose à trouver à ne pas avoir besoin de faire - il gère automatiquement la transmission de chaque fichier en tant qu'agent unique pour vous.

Si vous croyez que vous avez besoin de masquage pour trouver des trouvailles {} bretelles , n'hésitez pas à visiter ma question qui demande des preuves. Mon assertion est: vous ne le faites pas.

22
user unknown

Les noms de fichier de tuyauterie en toute sécurité à xargs exigent que votre find prend en charge la -print0 option et votre xargs a l'option correspondante de la lire (--null ou -0). Sinon, les noms de fichiers avec des caractères non transmissibles ou des backslashes ou des devis ou des espaces blancheurs dans le nom peuvent causer un comportement inattendu. D'autre part, find -exec {} + est dans le POSIX find SPE SPEC , il est donc portable et c'est à peu près aussi sûr que find -print0 | xargs -0, et certainement plus sûr que find | xargs. Je recommanderais Jamais Faire find | xargs sans pour autant -print0.

26
jw013

Si vous utilisez le -exec ... ; Formulaire (mémoriser pour échapper au point-virgule), vous exécutez la commande une fois par nom de fichier. Si tu utilises -print0 | xargs -0, vous exécutez plusieurs commandes par nom de fichier. Vous devriez définitivement utiliser le -exec + Formulaire, qui met plusieurs fichiers dans une seule ligne de commande et est beaucoup plus rapide lorsqu'un grand nombre de fichiers est impliqué.

Un gros plus d'utiliser xargs est la possibilité d'exécuter plusieurs commandes en parallèle en utilisant xargs -P. Sur les systèmes multicœurs, pouvant offrir d'énormes économies de temps.

11
Alexios

En ce qui concerne la performance, je pensais que -exec … + serait tout simplement mieux parce que c'est un seul outil qui fait tout le travail, mais ne partie de GNU= Documentation de la restauration indique que -exec … + Peut être moins efficace dans certains cas:

[Trouvez avec -exec … +] peut être moins efficace que certaines utilisations de xargs; Par exemple, xargs permet de construire de nouvelles lignes de commande pendant que la commande précédente est toujours exécutée et vous permet de spécifier un certain nombre de commandes à exécuter en parallèle. Cependant, le find ... -exec ... + Construire a l'avantage d'une large portabilité. GNU Westerutils n'a pas soutenu '-exec ... + 'Jusqu'à la version 4.2.12 [janvier 2005] ; L'une des raisons pour lesquelles cela a déjà eu le '-print0 'Action en tout cas.

Je ne savais pas exactement ce que cela signifiait alors j'ai demandé dans le chat où Derobert l'a expliqué comme suit:

find pourrait probablement continuer à rechercher le prochain lot de fichiers alors que le -exec … + est en cours d'exécution, mais ce n'est pas le cas.
[.____] find … | xargs … fait, car la recherche est un processus différent et continue de fonctionner jusqu'à ce que le tampon de tuyau se remplisse

(Formatage par moi.)

Donc, il y a ça. Mais si la performance compte vraiment que vous devriez faire une benchmarking réaliste ou plutôt vous demander si vous voudriez même utiliser des coquillages pour de tels cas.

Ici sur ce site, je pense qu'il vaut mieux conseiller aux gens d'utiliser le -exec … + forme dans la mesure du possible parce que c'est simplement parce que c'est plus simple et que les raisons mentionnées dans les autres réponses ici (par exemple, manipuler des noms de fichiers étranges sans avoir à penser beaucoup).

8
phk