find -name "*.avi" -print0 | xargs -0 -n 1 echo
Você não precisa echo
in xargs
:
find -name "*.avi" -print0 | xargs -0 -n 1 ./myscript
Eu tenho o seguinte script - é suposto fazer o loop de nomes de arquivos usando o find, mas ele parece quebrar os nomes dos arquivos em um espaço? Preciso que os nomes dos arquivos permaneçam intactos
#!/bin/bash
for file in 'find -name "*.avi"'
do
./myscript $file
done
Alguém pode me ajudar?
Obrigado
Além disso: find -name "*.avi" -exec ./myscript '{}' \;
A resposta da Womble definitivamente funciona na maioria dos casos, mas o Xargs não é perfeito com espaços em todas as implementações. Eu nunca encontrei o modo 'exec' para quebrar. Solaris estava particularmente irritado com relação a isso.
Obviamente, a '-print' seria melhor para simplesmente gerar saída para uma lista de arquivos em um loop for. Mas se você estiver executando um comando em uma lista de arquivos, é mais eficiente apenas executar a opção '-exec'.
Se você não precisa recursão:
#!/bin/bash
for file in *.avi
do
./myscript "$file"
done
Observe que as aspas ao redor da variável são essenciais.
Editar:
Como kojiro aponta, se você precisar de recursão e tiver o Bash 4, você pode adicionar shopt -s globstar
e alterar o glob para **/*.avi
.
Além das soluções baseadas em xargs e find -exec, há também a opção de canalizar enquanto lê. Ele tem a vantagem de permitir que você estruture seu script de maneira mais clássica. Deixe-me aplicá-lo ao seu exemplo.
find -name "*.avi" | while read avifile; do
./myscript "$avifile"
done