如何在bash脚本中保留文件夹结构?

时间:2015-01-03 04:42:43

标签: bash

我制作了一个转换音乐比特率的程序。该计划如下..

for f in *.mp3 ;
  do lame --mp3input -b $bitrate "$f" $path_to_destination/"$f" ;
done;

但这仅适用于一个文件夹;我在不同的文件夹中有音乐。如何修改代码,以便它可以递归地进行转换,但仍保留输出中的文件夹结构?

2 个答案:

答案 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