find-exec cmd {} + vs | xargs
Lequel est le plus efficace sur une très vaste ensemble de fichiers et devrait être utilisé?
find . -exec cmd {} +
ou
find . | xargs cmd
(À supposer qu'il n'y a pas de drôles de caractères dans les noms de fichiers)
- Connexes: stackoverflow.com/questions/9612090/...
Vous devez vous connecter pour publier un commentaire.
Différence de vitesse sera insignifiant.
Mais vous devez vous assurer que:
Votre script ne sera pas supposer qu'aucun
fichier aura de l'espace, tabulation, etc dans
nom de fichier; la première version est
coffre-fort, la seconde ne l'est pas.
Votre script ne sera pas traiter un fichier commençant par "
-
" comme une option.De sorte que votre code devrait ressembler à ceci:
ou
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, que "
-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.exec
sera de sortie des résultats qu'ils sont trouvés, wherasxargs
sera, paraît-il, attendre jusqu'à ce que l'ensemble de la recherche de l'annuaire avant d'écrire sur la sortie standard stdout. Si vous essayez ceci sur un grand répertoire, et il semble quexargs
ne fonctionne pas, la patience est conseillé.find
toujours sorties des noms de fichier avec un chemin d'accès (par exemple,./file
) je ne vois pas pourquoi--
serait nécessaire dans ce cas. Il est vrai cependant qu'en raison de possible caractères de saut de ligne le zéro-séparateur de paramètres sont nécessaires.zero-delimiter settings
?find . -exec cmd -- {} +
pour éviter l'expansion de-
comme une option? Si je ne suis pas au courant qu'il y a des fichiers qui précèdent avec-
par exemple-file1.txt
, la réponse semble suggère que j'aurais à utiliser-- {}
.-0
dans la commandexargs -0
?0
. Le-print0
option pour trouver et-0
pour xargs forces filesnames être séparés avec l'octet 0. Vous avez raison au sujet de--
, bien que moderne GNU trouver produit jamais les noms de fichiers commençant par-
une bonne idée en général pour séparer les options et les arguments dans le cas où les trouver va être remplacé par un autre programme.-print0
pas utilisé avec la premièrefind
commande? Afin de clarifier l'utilisation de--
, voulez-vous dire qu'il est toujours préférable de l'inclure dans la commande?-print0
trouver les retours des noms de fichiers séparés par un saut de ligne, mais de retour à la ligne peut aussi être une partie d'un nom de fichier, rendant ambigu. Octet 0 ne peut pas, de sorte qu'il est sûr de séparateur. Oui - l'ajout de--
à une commande qui prend en charge c'est une bonne pratique lorsque vous ne pouvez pas contrôler ses arguments, même si pas toujours strictement nécessaire ou dangereux.-print0
: pastebin.com/3irfB3tWest plus efficace (il s'exécute
cmd
peu de fois que possible, à la différence deexec
, qui s'exécutecmd
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é à être utilisé:
ça va marcher, même si les noms de fichiers contiennent funky caractères (
-print0
faitfind
impression NUL de terminaison correspond,-0
faitxargs
s'attendre à ce format.)xargs
approche est en fait beaucoup plus lentement si il n'y a pas (ou peu) les fichiers correspondants etcmd
n'a pas beaucoup à faire pour chaque fichier. Par exemple, lorsque vous exécutez dans un répertoire vide, lexargs
version prendra au moins deux fois plus de temps, puisque les deux processus doivent être démarré au lieu d'un seul. (Oui, la différence est généralement imperceptible sur *nix, mais dans une boucle, il pourrait être important; ou, l'essayer sur Windows quelques temps ...)Moderne
xargs
's les versions supportent souvent parallèle pipeline d'exécution.Évidemment il pourrait être un point de pivot quand il s'agit de choix entre
find … -exec
et
… | xargs