O que significa “{} \;” em um comando do Linux?

25

Às vezes, vejo o seguinte comando:

find . -name  * -exec ls -a {} \;

Fui solicitado a executar isso.

O que significa {} \; aqui?

    
por codeofnode 29.08.2013 / 20:27

2 respostas

38

Se você executar find com exec , {} expandirá para o nome de cada arquivo ou diretório encontrado com find (para que ls em seu exemplo obtenha todos os nomes encontrados como argumento - observe que ele chama ls ou qualquer outro comando que você especificar uma vez para cada arquivo encontrado).

O ponto-e-vírgula ; encerra o comando executado por exec . Ele precisa ser escapado com \ para que o shell que você executa find inside não o trate como seu próprio caractere especial, mas passe-o para find .

Veja este artigo para alguns mais detalhes.

Além disso, find fornece alguma otimização com exec cmd {} + - quando executado assim, find acrescenta arquivos encontrados ao final do comando em vez de invocá-lo uma vez por arquivo (para que o comando seja executado apenas uma vez, se possível).

A diferença no comportamento (se não na eficiência) é facilmente perceptível se for executada com ls , por exemplo

find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +

Supondo que você tenha alguns arquivos jpg (com caminhos suficientemente curtos ), o resultado é uma linha por arquivo no primeiro caso e o comportamento padrão ls de exibir arquivos em colunas para o último.

    
por moon.musick 29.08.2013 / 20:39
16

Na página de manual do comando find :

-exec command ;
              Execute  command;  true if 0 status is returned.  All following arguments to find are taken to be arguments to
              the command until an argument consisting of ';' is encountered.  The string '{}' is replaced  by  the  current
              file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it
              is alone, as in some versions of find.  Both of these constructions might need to be escaped (with a  '\')  or
              quoted  to  protect them from expansion by the shell.

Então aqui está a explicação:

{} significa "a saída de find ". Como em "o que seja find encontrado". find retorna o caminho do arquivo que você está procurando, certo? Então {} substitui; é um espaço reservado para cada arquivo que o comando find localiza (retirado de aqui ).

A parte \; está basicamente dizendo find "ok, terminei o comando que queria executar".

Exemplo:

Digamos que eu esteja em um diretório cheio de arquivos .txt . Eu então corro:

find . -name  '*.txt' -exec cat {} \;

A primeira parte, find . -name *.txt , retorna uma lista dos arquivos .txt . A segunda parte, -exec cat {} \; , executará o comando cat para cada arquivo encontrado por find , portanto cat file1.txt , cat file2.txt e assim por diante.

    
por Alaa Ali 29.08.2013 / 20:41