find -name '*.ogg' -print0 | xargs -0 -L1 command
Quando executo for i in $(find -name '*.ogg'); do echo '$i'; done
, não obtenho uma linha por arquivo como esperado. Em vez disso, quando um nome de arquivo tem um espaço, cada palavra sai em uma linha separada, portanto não posso executar comandos nos arquivos.
Aqui está um exemplo de talvez o que você quer fazer:
#! /bin/sh
IFS="\n"
for xxx in 'cat /etc/hosts'
do
echo $xxx
done
exit 0
I.E: Altere o IFS (Inter Field Seperator) para \ n em vez de espaço, tab, \ n
Você deve canalizar find
em um loop while
:
find -name '*.ogg' | while read -r i; do echo "$i"; done
Além disso, as aspas simples que você tinha em torno de $i
impediriam que a variável fosse expandida para seu valor.
Outra maneira é usar a substituição de processos:
while read -r i; do echo "$i"; done < <(find -name '*.ogg')
que tem a vantagem de não criar um subshell a partir do loop while
, então variáveis configuradas (e outras mudanças no ambiente) dentro do loop estarão disponíveis após o término do loop.
Se você deseja executar o comando em paralelo e se o GNU Parallel http: // www.gnu.org/software/parallel/ estiver instalado, poderá fazer isso:
find -name '*.ogg' | parallel do_stuff {} --options otherargs
Assista ao vídeo de introdução do GNU Parallel para saber mais: link
Além disso, não há necessidade de find
neste caso. Você pode definir a opção globstar
e usar bash globbing.
shopt -s globstar
for i in **/*.ogg; do echo '$i'; done
Tags command-line bash linux