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".
Respostas:
A lógica dada na especificação POSIX é:
A Interpretação PASC 1003.2 # 210 entra em mais detalhes sobre a história de
-exec … {} +
. Ele existia em vários sistemas Unix antes de ser adotado pelo POSIX; o relatório de defeitos o rastreia de volta ao SVR4 (onde não havia documentos em grande parte). O relatório de defeitos justifica a alteração incompatível como tendo pouco impacto na prática:Embora a adição de suporte
-exec … {} +
interrompa alguns aplicativos em conformidade, como o exemplo acima, há menos deles do que se-exec … {} … +
fosse permitido.Outro motivo, talvez, para restringir
{}
o último argumento é a facilidade de implementação. Se{}
fosse permitido em qualquer lugar da lista de argumentos-exec
, ofind
programa teria que criar a linha de comando copiando os argumentos estáticos, depois a parte variável e depois outra parte estática. Isso dificultaria a construção da lista de argumentos e a contabilização do limite de tamanho. A dificuldade é mínima, mas os implementadores gostam de cortar custos. O suporte a várias instâncias substituíveis de{}
(se quiser-exec {} foo +
funcionar, pode-se esperar logicamente que-exec {} foo {} +
também) seria significativamente mais difícil.fonte