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.