Localizar e loop for

0

Tentando fazer uma conversão em massa de M4A para OGG em uma grande coleção de músicas, tenho:

#!/bin/sh
for i in 'find /home/family/Music -name *.m4a -print0'
   #do ffmpeg -i "$i" -acodec libvorbis -aq 6 -vn -ac 2 "$i.ogg";
   do echo $i
done

Todos os arquivos terão espaços em seus nomes, a saída acima mostra um único arquivo como este:

/home/family/Music/The
Kooks/Inside
In
_
Inside
Out/06
You
Don't
Love
Me.m4a

Todo espaço marca uma nova linha, achei que -print0 consertaria isso?

    
por wjdp 01.10.2014 / 19:19

2 respostas

4

Use o loop while junto com read -d '' -r :

find /home/family/Music -name '*.m4a' -print0 | while read -d '' -r file; do
   echo "$file"
done
    
por 01.10.2014 / 19:33
2

Você pode mover o loop externo para um loop "interno" e evitar problemas de divisão de palavras, como:

find /home/family/Music -name '*.m4a' -exec \
sh -c 'for i; do ffmpeg -i "$i" -acodec libvorbis -aq 6 -vn -ac 2 "$i.ogg"; done' sh {} +

Observe que -print0 não é mais necessário Além disso, você precisa citar *.m4a para evitar a expansão acidental do glob por shell

    
por 01.10.2014 / 20:11