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 -execargumento 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 ofIEEE PASC Interpretation 1003.2 #210y 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".