La syntaxe est:
find ... -exec cmd {} +
find
trouvera un certain nombre de fichiers en fonction des critères dans ...
et s'exécutera cmd
avec cette liste de chemins de fichiers comme arguments, autant que possible sans dépasser la limite de la taille des arguments d'une commande.
Si nécessaire, il peut diviser la liste des fichiers et appeler cmd
plusieurs fois. Par exemple, il peut finir par appeler:
cmd ./file1 ./file2 ... ./file3000
cmd ./file3001 ./file3002 ... ./file4321
Une limitation à cela est que cela {}
doit être le dernier. Vous ne pouvez pas par exemple écrire:
find ... -exec cmd {} other args +
comme vous pourriez avec ';'
au lieu de '+'
.
Tu peux écrire:
find ... -exec echo foo {} +
mais non:
find ... -exec echo {} foo +
Donc, si vous avez besoin d'ajouter des arguments supplémentaires cmd
après la liste des fichiers, vous devez recourir à l'appel d'un shell. (D'autres raisons pour lesquelles vous auriez besoin d'appeler un shell seraient chaque fois que vous avez besoin d'utiliser une fonctionnalité de shell comme les redirections, les tuyaux, certaines extensions de chaîne ....)
Dans sh -c 'inline-script' x a b c
, pour le inline-script
, $0
est x
, $1
est a
, $2
est b
... ainsi que "$@"
la liste de ces 3 arguments: a, b et c. Donc dans:
find ... -exec sh -c 'cmd "$@" other arg' find-sh {} +
Pour le script en ligne , $0
(qui est utilisé par exemple lors de l'affichage de messages d'erreur) est défini sur find-sh
et "$@"
est la liste des fichiers (ce qui se find
développe {}
).
En utilisant le exec
module intégré spécial du shell:
find ... -exec sh -c 'exec cmd "$@" other arg' find-sh {} +
Nous disons au shell de ne pas lancer un processus supplémentaire à exécuter cmd
, mais plutôt de l'exécuter dans le même processus (en remplaçant le processus shell en cours d'exécution par cette commande). Certains shells aiment bash
, zsh
et certaines implémentations de le ksh
font implicitement pour la dernière commande d'un script.
-exec sh -c '(cmd1; cmd2;)' find-sh {} +
?find-sh {}
sont des arguments pour la commande sh -c '...', non?find
appellera/bin/sh
avec comme arguments("sh", "-c", "...", "find-sh", "./file1", "./file2"...). And inside
..., that maps (the shells maps that) to
$ 0` être"find-sh"
, et les paramètres de position ($1
,$2
... que vous pourriez dire que les arguments du script en ligne ) étant./file1
,./file2
.