Prefazione: capisco la differenza tra -exec {} \;
& -exec {} +
. Inoltre non ho un problema in quanto tale , sono solo curioso della semantica di find
.
Quando si termina l' -exec
argomento con +
anziché anziché ;
, è necessario terminarlo con {} +
, ad esempio:
# 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'uso ;
in questi esempi invece di +
funziona benissimo (ma ovviamente fa qualcos'altro).
Da POSIX :
-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +
... Solo un <plus-sign> che segue immediatamente un argomento contenente solo i due caratteri "
{}
" deve punteggiare la fine dell'espressione primaria. Gli altri usi di <plus-sign> non devono essere considerati speciali.
In altre parole, quando si utilizza il +
, il comando deve terminare con {} +
.
Perchè è questo? E perché solo con il +
e non il ;
? All'inizio ho pensato forse di evitare conflitti con i nomi di file che contengono un +
, ma i nomi di file con un ;
sembrano funzionare bene? Trovo difficile credere che questa limitazione sia arbitraria ...
The "-exec ... {} +" syntax adopted was a result of
IEEE PASC Interpretation 1003.2 #210
e in quel documento troverai maggiori dettagli, ad esempio: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".