Prefácio: Entendo a diferença entre -exec {} \;
& -exec {} +
. Eu também não tenho um problema como tal , estou apenas curioso sobre a semântica de find
.
Ao finalizar o -exec
argumento com em +
vez de ;
, precisamos finalizar com {} +
, por exemplo:
# 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 ;
esses exemplos em vez de +
funcionar bem (mas obviamente faz outra coisa).
Do POSIX :
-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +
... Somente um <plus-sign> que segue imediatamente um argumento contendo apenas os dois caracteres "
{}
" deve pontuar o final da expressão primária. Outros usos do <plus-sign> não devem ser tratados como especiais.
Em outras palavras, ao usar o +
, o comando precisa terminar com {} +
.
Por que é isso? E por que apenas com +
e não o ;
? No começo, pensei em talvez evitar conflitos com nomes de arquivos que contenham a +
, mas nomes de arquivos com a ;
parecem funcionar bem? Acho difícil acreditar que essa limitação é arbitrária ...
The "-exec ... {} +" syntax adopted was a result of
IEEE PASC Interpretation 1003.2 #210
e nesse documento você encontrará mais detalhes, por exemplo: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".