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.