Préface: Je comprends la différence entre -exec {} \;
& -exec {} +
. Je n'ai pas non plus de problème en tant que tel , je suis juste curieux de connaître la sémantique de find
.
Lorsque vous terminez l' -exec
argument avec +
au lieu de ;
, nous devons terminer cela avec {} +
, par exemple:
# FreeBSD find
$ find . -type f -exec cp {} /tmp +
find: -exec: no terminating ";" or "+"
# GNU find is even more cryptic:
$ find: missing argument to `-exec'
L'utilisation ;
dans ces exemples au lieu de +
fonctionne très bien (mais fait évidemment autre chose).
De POSIX :
-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +
... Seul un <plus-sign> qui suit immédiatement un argument ne contenant que les deux caractères "
{}
" doit ponctuer la fin de l'expression principale. Les autres utilisations de <plus-sign> ne doivent pas être traitées comme spéciales.
En d'autres termes, lorsque vous utilisez le +
, la commande doit se terminer par {} +
.
Pourquoi est-ce? Et pourquoi seulement avec le +
et non le ;
? Au début, je pensais peut-être éviter les conflits avec les noms de fichiers qui contiennent un +
, mais les noms de fichiers avec un ;
semblent bien fonctionner? J'ai du mal à croire que cette limitation est arbitraire ...
The "-exec ... {} +" syntax adopted was a result of
IEEE PASC Interpretation 1003.2 #210
et dans ce document, vous trouverez plus de détails, par exemple:Note that the "+" is only treated as special if it immediately follows "{}". This minimises the chances of causing problems with existing uses of "+" as an argument with "-exec".