検索とforループ

検索とforループ

大規模な音楽コレクションからM4AをOGGに大規模に変換しようとすると、次のような結果が得られました。

#!/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

すべてのファイル名にはスペースがあり、上記の出力には次のファイルが表示されます。

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

各スペースは新しい線を表示します。それでは-print0問題を解決できますか?

答え1

while次の文でループを使用してくださいread -d '' -r

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

答え2

次のように、外部ループを「内部」ループに移動して、単語の分離の問題を回避できます。

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 {} +

また、シェルによる予期しないグローバル拡張を防ぐためには-print0必要ありません。*.m4a

関連情報