111 votes

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 a pas de personnages amusants dans les noms de fichiers)

103voto

Tometzky Points 8230

Différence de vitesse sera insignifiant.

Mais vous devez vous assurer que:

  1. Votre script ne sera pas supposer qu'aucun fichier aura pas d'espace, tabulation, etc nom de fichier; la première version est coffre-fort, la seconde ne l'est pas.

  2. Votre script ne sera pas traiter un fichier commençant par "-" comme une option.

Ainsi, 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 d'écrire que vous pouvez ignorer 1, mais la deuxième version est plus portable et fort,"-exec cmd {} +" est relativement nouvelle option dans GNU findutils (depuis 2005, beaucoup de systèmes en cours d'exécution, elle ne sera pas encore) et il a été buggy récemment. Aussi beaucoup de gens ne savent pas ce "-exec cmd {} +", comme vous pouvez le voir à partir d'autres réponses.

8voto

ASk Points 2525
find . | xargs cmd

est plus efficace (il s'exécute cmd peu de fois que possible, à la différence de exec, qui s'exécute cmd une fois pour chaque match). Cependant, vous serez confronté à des problèmes si les noms de fichiers contenant des espaces ou funky caractères.

Le suivant est suggéré:

find . -print0 | xargs -0 cmd

ça va marcher, même si les noms de fichiers contiennent funky caractères (-print0 fait find imprimer NUL de terminaison correspond, -0 fait xargs s'attendre à ce format.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X