find não encontra todos os arquivos

0

Eu tenho a seguinte estrutura de arquivos / diretórios:

tsunami # find .
.
./dir1
./dir1/dirinner
./dir1/dirinner/innerfile
./logs
./messages

Estou tentando encontrar arquivos de forma recursiva e processá-los usando o comando find / exec.

A versão do find (vem com o busybox) não permite o uso do nome do arquivo descoberto mais de uma vez no comando exec como discutido aqui . Então, usei uma das soluções sugeridas. Então, eu reescrevi isto:

find  * -type f -exec echo {}  +

para isso:

find  * -type f -exec sh -c 'echo $0' {}  +

Mas a nova versão encontra apenas o arquivo mais interno e nada mais.

Aqui está a saída para ambos:

tsunami # find  * -type f -exec echo {}  +
dir1/dirinner/innerfile logs messages
tsunami # find  * -type f -exec sh -c 'echo $0' {}  +
dir1/dirinner/innerfile

Como faço para corrigir isso? Eu preciso encontrar todos os arquivos, não apenas o mais interno.

    
por hebbo 14.05.2018 / 19:16

1 resposta

2

Eu assumo que echo é apenas sua cobaia para executar experimentos em (única find . -type f faz o trabalho de imprimir caminhos de arquivo).

Na minha resposta eu uso find . … em vez de find * … - para simplificar. Se você tem suas razões para usar o globo ocular, siga em frente.

Seu problema é porque a sintaxe -exec … {} + substitui vários caminhos de uma vez no lugar de {} ; assim, em -exec sh -c 'echo $0' {} + , o sh recebe muitos argumentos, mas $0 refere-se a apenas um, o restante permanece sem uso.

Use "$@" , isso significa "$1" "$2" "$3" … . Porque ele ignora $0 você precisa fornecer um argumento extra (fictício). Para sh , uso sh :

find . -type f -exec sh -c 'echo "$@"' sh {} +

Observe também que, se isso encontrar muitos arquivos para uma linha de comando, várias sh -s (portanto, vários echo -s) seriam executados.

Como alternativa, em vez de -exec … {} + use -exec … \; :

find . -type f -exec sh -c 'echo "$0"' {} \;

Isso executará um sh separado para cada arquivo, então $0 é suficiente.

Outra diferença é: a maioria das implementações de find requer que {} esteja um pouco antes de + , mas no caso de \; this {} pode estar em qualquer lugar entre -exec e \; . Isso significa que:

  • -exec foo {} bar + é inválido;
  • -exec foo {} bar \; está OK.

Essa diferença não importa em seu caso particular.

    
por 14.05.2018 / 19:39