Qual é o significado de {} + no comando find's -exec?

23

Quero saber o significado de {} +no execcomando 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 {} \;
Mohsen
fonte
5
É descrito em man find(1)muitos detalhes, facilmente encontrado por qualquer pessoa. Não seja preguiçoso.
Miroslav Koškár 10/04
Obrigado querido Miroslav, eu procurei man exec!
Ah, eu nunca havia me deparado com o {} +uso antes. I normalmente usar xargs para que (e frequentemente find ... -print0 | xargs -0 ...)

Respostas:

27

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 xargscomando 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:

kenorb
fonte
Não é uma diferença e um dos principais. Veja a resposta de user1116056
Jahid
24

Dado que o comando find fica abaixo de três arquivos:

fileA
fileB
fileC

Se você usar -execcom 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 xargscria suas linhas de comando. O número total de chamadas do comando ( chmodneste caso) será muito menor que o número de arquivos correspondentes.

Se você usar -execum ponto-e-vírgula ( ;),

find . -type f -exec chmod 775 {} \;

será:

chmod 775 fileA
chmod 775 fileB
chmod 775 fileC
user1116056
fonte
5

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.

BE77Y
fonte