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 {} \;
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 {} \;
Respostas:
Usando ;
(ponto e vírgula) ou+
(sinal de mais) é obrigatório para encerrar os comandos do shell invocados por -exec
/ execdir
.
A diferença entre ;
(ponto e vírgula) ou +
(sinal de mais) é como os argumentos são passados para -exec
/-execdir
parâmetro . Por exemplo:
usando ;
executa 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 seguintes argumentos para
find
são considerados argumentos para o comando.A sequência
{}
é substituída pelo nome do arquivo atual que está sendo processado.
usando +
executará os comandos menos possíveis (como os argumentos são combinados). É muito semelhante à forma como o xargs
comando funciona, portanto, ele usará o maior número possível de argumentos por comando 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 é criada anexando cada nome de arquivo selecionado no final.
Somente uma instância de
{}
é permitida dentro do comando.
Veja também:
Dado que o comando find fica abaixo de três arquivos:
fileA
fileB
fileC
Se você usar -exec
com um +
sinal de mais ( ),
find . -type f -exec chmod 775 {} +
será:
chmod 775 fileA fileB fileC
A linha de comando é criada anexando cada nome de arquivo correspondente no final, da mesma maneira que xargs
cria suas linhas de comando. O número total de chamadas do comando ( chmod
neste caso) será muito menor que o número de arquivos correspondentes.
Se você usar -exec
um ponto-e-vírgula ( ;
),
find . -type f -exec chmod 775 {} \;
será:
chmod 775 fileA
chmod 775 fileB
chmod 775 fileC
Conforme man find
:
comando -exec {} + Essa variante da ação -exec executa o comando especificado nos arquivos selecionados, mas a linha de comando é criada 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 maneira que o xargs cria suas linhas de comando. Somente uma instância de '{}' é permitida dentro do comando. O comando é executado no diretório inicial.
man find(1)
muitos detalhes, facilmente encontrado por qualquer pessoa. Não seja preguiçoso.