查找和 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以避免 shell 意外的全局扩展

相关内容