Quero saber o significado de {} +
no exec
comando e qual é a diferença entre {} +
e {} \;
. Para ser exato, qual é a diferença entre esses dois:
find . -type f -exec chmod 775 {} + find . -type f -exec chmod 775 {} \;
Comentários
Resposta
Usar ;
(ponto e vírgula) ou +
(sinal de mais) é obrigatório para encerrar os comandos shell invocados por -exec
/ execdir
.
A diferença entre ;
(ponto e vírgula) ou +
(sinal de mais) é como os argumentos são passados para find “s -exec
/ -execdir
parâmetro. Por exemplo:
-
usar
;
executará vários comandos (separadamente para cada argumento),Exemplo:
$ find /etc/rc* -exec echo Arg: {} ";" Arg: /etc/rc.common Arg: /etc/rc.common~previous Arg: /etc/rc.local Arg: /etc/rc.netboot
Todos os argumentos seguintes para
find
são considerados argumentos para o comando.A string
{}
é substituído pelo nome do arquivo atual e sendo processado. -
usando
+
executará o mínimo de comandos possível (pois os argumentos são combinados). É muito semelhante a como o comandoxargs
funciona, então usará tantos argumentos por comando quanto possível para evitar exceder o limite máximo de argumentos por linha.Exemplo:
$ find /etc/rc* -exec echo Arg: {} "+" Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
A linha de comando é construída anexando cada nome de arquivo selecionado no final.
Apenas uma instância de
{}
é permitida no comando.
Veja também:
-
man find
- Usando ponto e vírgula (;) vs mais (+) com exec em find em SO
- Comando unix simples, o que é o {} e \; para no SO
Comentários
- Há uma diferença importante. Veja a resposta user1116056 ' s
Resposta
Dado que o comando find fica abaixo de três arquivos:
fileA fileB fileC
Se você usar -exec
com um sinal de mais (+
) assinar,
find . -type f -exec chmod 775 {} +
será:
chmod 775 fileA fileB fileC
A linha de comando é construída anexando-se cada nome de arquivo correspondente no final, que é da mesma forma que xargs
cria suas linhas de comando. O número total de invocações do comando (chmod
, neste caso) será muito menor que o número de arquivos correspondentes.
Se você usar -exec
com um ponto e vírgula (;
),
find . -type f -exec chmod 775 {} \;
será:
chmod 775 fileA chmod 775 fileB chmod 775 fileC
Resposta
De acordo com o man find
:
-exec command {} + This a variante da ação -exec executa o comando especificado nos arquivos selecionados, mas a linha de comando é construída anexando cada nome de arquivo selecionado no final; o número total de invocações do comando será muito menor que o número de arquivos correspondentes. A linha de comando é construída da mesma forma que xargs constrói suas linhas de comando. Apenas uma instância de ‘{}’ é permitida no comando. O comando é executado no diretório inicial.
man find(1)
em muitos detalhes, facilmente para ser encontrado por qualquer pessoa. Não ' seja preguiçoso.man exec
!{} +
antes. Eu normalmente uso xargs para isso (e frequentementefind ... -print0 | xargs -0 ...
)