Às vezes, vejo o seguinte comando:
find . -name * -exec ls -a {} \;
Me pediram para executar isso.
O que {} \;
significa aqui?
command-line
find
codeofnode
fonte
fonte
-name *
é redundante.-name *
é pior que redundante. Como*
não está entre aspas, o shell o expande para a lista de nomes de arquivos na pasta atual, com espaços sendo tratados incorretamente, levando a resultados inesperados ou a uma mensagem de erro. Como ponto extra,find
possui muitas funções, uma delas para listar arquivos; isso evita ter que usar-exec
. Por exemplo, você pode usarfind . -print
oufind . -ls
. Finalmente, há duas maneiras de escapar do ponto e vírgula: ou como você fez com a barra invertida,\;
ou por citar:';'
. Use o que você se sentir mais confortável.Respostas:
Se você executar
find
comexec
,{}
expande para o nome do arquivo de cada arquivo ou diretório encontradofind
(para quels
no seu exemplo obtenha todo nome de arquivo encontrado como argumento - observe que ele chamals
ou qualquer outro comando que você especificar uma vez para cada arquivo encontrado).O ponto e vírgula
;
termina o comando executado porexec
. Ele precisa ser escapado\
para que o shell no qual você executafind
não o trate como seu próprio caractere especial, mas o repasse parafind
.Veja este artigo para mais alguns detalhes.
Além disso,
find
fornece alguma otimização comexec cmd {} +
- quando executado dessa maneira,find
anexa os 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 de comportamento (se não em eficiência) é facilmente perceptível se executada com
ls
, por exemplo,Supondo que você tenha alguns
jpg
arquivos (com caminhos curtos o suficiente ), o resultado é uma linha por arquivo no primeiro caso e ols
comportamento padrão de exibir arquivos em colunas para o último.fonte
\;
com+
.find . -name * | ls -a -
?find
. Além disso, a saída dels
, nesse caso, aparentemente não depende da entrada - não importa para o que eu uso como filtrofind
,ls
apenas exibe o conteúdo do diretório de trabalho e é tudo. Verifique, por exemplofind ~ -iname '*.jpg' -exec ls -a {} \;
vsfind ~ -iname '*.jpg' | ls -a
.echo 'foo' | ls -a
.-
em seuls -a -
comando ao testar o que o @ dr-h consultou.Na página de manual do
find
comando :Então, aqui está a explicação:
{}
significa "a saída defind
". Como em "o que forfind
encontrado".find
retorna o caminho do arquivo que você está procurando, certo? Então o{}
substitui; é um espaço reservado para cada arquivo que ofind
comando localiza (extraído daqui ).A
\;
parte é basicamente dizendofind
"ok, eu terminei com o comando que eu queria executar".Exemplo:
Digamos que eu esteja em um diretório cheio de
.txt
arquivos. Então eu corro:A primeira parte
find . -name *.txt
,, retorna uma lista dos.txt
arquivos. A segunda parte,-exec cat {} \;
irá executar ocat
comando para cada arquivo encontradofind
, por issocat file1.txt
,cat file2.txt
e assim por diante.fonte
*.txt
deve ser citada como'*.txt'
. Isso ocorre porque, se houver.txt
arquivos na pasta atual, o shell expandirá isso e você obterá resultados incorretos ou uma mensagem de erro.find -name '*.txt' -exec cat {} \;