我制作了一个转换音乐比特率的程序。该计划如下..
for f in *.mp3 ;
do lame --mp3input -b $bitrate "$f" $path_to_destination/"$f" ;
done;
但这仅适用于一个文件夹;我在不同的文件夹中有音乐。如何修改代码,以便它可以递归地进行转换,但仍保留输出中的文件夹结构?
答案 0 :(得分:3)
如果你有足够新的Bash(版本4.3适用;版本3.x没有),你可以使用:
shopt -s globstar nullglob
for file in *.mp3 **/*.mp3
do
lame --mp3input -b $bitrate "$file" "$path_to_destination/$file"
done
globstar
选项意味着**
表示法递归地起作用; nullglob
选项意味着如果任何子目录(或没有子目录)中没有.mp3
个文件,则不会生成任何内容而不是默认情况下会发生的名称**/*.mp3
因为它使用了globbing,所以即使路径或文件名包含空格,换行符或其他笨拙字符也是安全的。
如果子目录不一定存在于$path_to_destination
下,那么您需要创建它们。添加:
mkdir -p $(dirname "$path_to_destination/$file")
在调用lame
之前。这将在通向目标文件的路径上创建所有缺少的目录(如果所有目录都已存在则没有错误),留下lame
在该目录中创建文件。
答案 1 :(得分:0)
find . -type f -name '*.mp3' | while IFS= read -r src
do
dst="$path_to_destination/$src"
mkdir -p $(dirname "$dst")
lame --mp3input -b $bitrate "$src" "$dst"
done