Prefacio: entiendo la diferencia entre -exec {} \;
& -exec {} +
. Tampoco tengo un problema como tal , solo tengo curiosidad por la semántica de find
.
Al finalizar el -exec
argumento con en +
lugar de ;
, necesitamos terminar esto con {} +
, por ejemplo:
# FreeBSD find
$ find . -type f -exec cp {} /tmp +
find: -exec: no terminating ";" or "+"
# GNU find is even more cryptic:
$ find: missing argument to `-exec'
Usar ;
en estos ejemplos en lugar de +
funciona bien (pero obviamente hace algo más).
Desde POSIX :
-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +
... Solo un <plus-sign> que sigue inmediatamente a un argumento que contiene solo los dos caracteres "
{}
" debe puntuar el final de la expresión primaria. Otros usos del <plus-sign> no se tratarán como especiales.
En otras palabras, cuando se usa +
, el comando debe terminar con {} +
.
¿Por qué es esto? ¿Y por qué solo con el +
y no con el ;
? Al principio pensé que tal vez evitaría conflictos con los nombres de archivo que contienen un +
, pero ¿los nombres de archivo con un ;
parecen funcionar bien? Me resulta difícil creer que esta limitación sea arbitraria ...
The "-exec ... {} +" syntax adopted was a result of
IEEE PASC Interpretation 1003.2 #210
y en ese documento encontrará más detalles, por ejemplo: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".