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

10

Eu quero saber o significado de {} + no comando exec 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 {} \;
    
por Mohsen 10.04.2015 / 10:26

3 respostas

11

Usar ; (ponto-e-vírgula) ou + (sinal de mais) é obrigatório para finalizar 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 o parâmetro -exec / -execdir de find. Por exemplo:

  • usando ; 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
    

    All following arguments to find are taken to be arguments to the command.

    The string {} is replaced by the current file name being processed.

  • usando + executará o mínimo de comandos possíveis (conforme os argumentos são combinados juntos). É muito semelhante a como o comando xargs funciona, portanto, ele usa o máximo 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
    

    The command line is built by appending each selected file name at the end.

    Only one instance of {} is allowed within the command.

Veja também:

por 17.04.2015 / 18:55
17

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, que é da mesma maneira que xargs constrói suas linhas de comando. O número total de invocações do comando ( chmod , nesse caso) será muito menor que o número de arquivos correspondentes.

Se você usa -exec com um ponto-e-vírgula ( ; ),

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

será:

chmod 775 fileA
chmod 775 fileB
chmod 775 fileC
    
por 10.04.2015 / 11:35
5

Como por man find :

-exec command {} + This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the total number of invocations of the command will be much less than the number of matched files. The command line is built in much the same way that xargs builds its command lines. Only one instance of ‘{}’ is allowed within the command. The command is executed in the starting directory.

    
por 10.04.2015 / 17:31

Tags