De man find
:
commande -exec;
Exécuter la commande; true si l'état 0 est renvoyé. Tous les arguments suivants à rechercher sont considérés comme des arguments de la commande jusqu'à ce qu'un argument consistant en ';' est rencontré. La chaîne '{}' est remplacée par le nom du fichier en cours de traitement partout où il apparaît dans les arguments de la commande, pas seulement dans les arguments où il est seul, comme dans certaines versions de find. Ces deux constructions peuvent avoir besoin d'être échappées (avec un '\') ou entre guillemets pour les protéger de l'expansion par le shell. Voir la section EXEMPLES sec pour des exemples d'utilisation de l'option '-exec'. La commande spécifiée est exécutée une fois pour chaque fichier correspondant.
La commande est exécutée dans le répertoire de départ. Il existe des problèmes de sécurité inévitables entourant l'utilisation de l'option -exec;
-exec commande {} +
Cette variante de l'option -exec exécute la commande spécifiée sur les fichiers sélectionnés, mais la ligne de commande est construite en ajoutant chaque nom de fichier sélectionné à la fin ; le nombre total d'appels de la commande sera bien inférieur au nombre de fichiers correspondants. La ligne de commande est construite à peu près de la même manière que xargs construit ses lignes de commande. Une seule instance de '{}' est autorisée dans la commande. La commande est exécutée dans le répertoire de départ.
Donc, d'après ce que je comprends, \;
exécute une commande distincte pour chaque fichier trouvé par find
, tandis que \+
ajoute les fichiers et exécute une seule commande sur chacun d'eux. Le \
est un caractère d'échappement, donc c'est:
ls testdir1; ls testdir2
contre
ls testdir1 testdir2
Faire ce qui précède dans mon shell reflétait le résultat de votre question.
exemple de quand vous voudriez utiliser \+
Supposons deux fichiers, 1.tmp
et 2.tmp
:
1.tmp:
1
2
3
2.tmp:
0
2
3
Avec \;
:
find *.tmp -exec diff {} \;
> diff: missing operand after `1.tmp'
> diff: Try `diff --help' for more information.
> diff: missing operand after `2.tmp'
> diff: Try `diff --help' for more information.
Alors que si vous utilisez \+
(pour concaténer les résultats de find
):
find *.tmp -exec diff {} \+
1c1,3
< 1
---
> 0
> 2
> 30
Donc, dans ce cas, c'est la différence entre diff 1.tmp; diff 2.tmp
etdiff 1.tmp 2.tmp
Il y a des cas où cela \;
est approprié et \+
sera nécessaire. L'utilisation de \+
with en rm
est une, où si vous supprimez un grand nombre de fichiers, les performances (vitesse) seront supérieures à \;
.