Quelle est la différence entre l'utilisation de '+' (plus) et de ';' (point-virgule) dans la commande -exec?

28

Je me demande de savoir quelle est la différence entre l'utilisation +et ;la fin de la -execcommande lorsque j'utilise en findcommande?

find .... -exec ... \; 

CONTRE

find .... -exec ... + 
αғsнιη
la source

Réponses:

36

-exec ... \;exécutera un élément après l'autre. Donc, si vous avez trois fichiers, la ligne exec s'exécutera trois fois.

-exec ... {} +est pour les commandes qui peuvent prendre plus d'un fichier à la fois (par exemple cat, stat, ls). Les fichiers trouvés par findsont enchaînés comme une xargscommande. Cela signifie moins de bifurcation et pour les petites opérations, cela peut signifier une accélération substantielle.

Voici une démonstration des performances contenant 10 000 fichiers vides.

$ mkdir testdir
$ touch testdir/{0000..9999}

$ time find testdir/ -type f -exec cat {} \;
real    0m8.622s
user    0m0.452s
sys     0m8.288s

$ time find testdir/ -type f -exec cat {} +
real    0m0.052s
user    0m0.015s
sys     0m0.037s

Encore une fois, cela ne fonctionne que sur les commandes qui peuvent prendre plusieurs noms de fichiers. Vous pouvez savoir si votre commande est comme ça en regardant sa page de manuel. Voici le synopsis de man cat:

SYNOPSIS
       cat [OPTION]... [FILE]...

Les points de suspension activés [FILE]...signifient qu'il peut prendre plusieurs fichiers.

+ne peut être utilisé que sur des commandes uniques et vous devez en avoir exactement une {}sur la ligne. \;peut fonctionner avec plusieurs groupes de zéro à plusieurs.

Oli
la source
4
Exemple: avec \;, la commande exécutée serait cat 1; cat 2; cat 3. Avec +, la commande exécutée serait cat 1 2 3.
Alaa Ali
AFAIK, le +n'est pas POSIX, donc peut ne pas être disponible sur les systèmes non Linux. Pas un problème si vous ne quittez jamais la plate-forme, mais bon de savoir si vous devez utiliser Solaris. :)
Simon Richter
Oh gentil, merci pour l'info. Je typiquement -exec <command> {} ';'parce que c'est plus facile sur ma frappe (je peux toucher le texte mais je n'ai pas exactement la meilleure technique).
hanetzer
2
@SimonRichter: Non, -exec ... {} +c'est POSIX. Voir: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
cuonglm
@SimonRichter L' -exec ... {} +extension a été suggérée pour être incluse dans les spécifications POSIX en 2001 et ratifiée dans le numéro 6 de POSIX en 2004. Il est possible que la version de Solaris à laquelle vous êtes habitué soit plus ancienne que la norme POSIX (ou cible simplement une version antérieure).
Oli