web-dev-qa-db-fra.com

find -exec cmd {} + vs | Xargs

Lequel est le plus efficace sur un très grand ensemble de fichiers et devrait être utilisé?

find . -exec cmd {} +

ou

find . | xargs cmd

(Supposons qu'il n'y ait pas de personnages amusants dans les noms de fichiers)

111
dogbane

La différence de vitesse sera insignifiante.

Mais vous devez vous assurer que:

  1. Votre script ne supposera pas qu'aucun fichier n'aura d'espace, de tabulation, etc. dans le nom de fichier; la première version est sûre, la seconde ne l'est pas.

  2. Votre script ne traitera pas un fichier commençant par "-" Comme une option.

Donc, votre code devrait ressembler à ceci:

find . -exec cmd -option1 -option2 -- {} +

ou

find . -print0 | xargs -0 cmd -option1 -option2 --

La première version est plus courte et plus facile à écrire car vous pouvez en ignorer 1, mais la deuxième version est plus portable et plus sûre, comme "-exec cmd {} + "est une option relativement nouvelle dans GNU findutils (depuis 2005, beaucoup de systèmes en cours d'exécution ne l'auront pas encore)) et c'était n buggy récemment . les gens ne le savent pas "-exec cmd {} + ", comme vous pouvez le voir à partir d’autres réponses.

103
Tometzky
find . | xargs cmd

est plus efficace (il exécute cmd aussi peu de fois que possible, contrairement à exec, qui exécute cmd une fois pour chaque correspondance). Cependant, vous rencontrerez des problèmes si les noms de fichiers contiennent des espaces ou des caractères géniaux.

Il est suggéré d'utiliser ce qui suit:

find . -print0 | xargs -0 cmd

cela fonctionnera même si les noms de fichiers contiennent des caractères géniaux (-print0 fait find imprimer les correspondances terminées par NUL, -0 fait xargs attendre ce format.)

8
ASk

Les versions modernes de xargs prennent souvent en charge l'exécution parallèle du pipeline.

Évidemment, cela pourrait être un point pivot en ce qui concerne le choix entre find … -exec et … | xargs

2
poige