Bash - 递归调用目录

时间:2015-12-19 14:55:16

标签: bash recursion

我有一个名为Original的目录,其中包含各种文件夹中包含的flac文件(所有扩展名为* flac)艺术家),例如Original/ABBA/Arrival/02 Dancing Queen.flac

使用Bash,我想对这些文件运行flac -d命令,输出设置为新的父目录(Raw),但具有相同的子目录& filename作为输入文件,例如完整的命令是:

flac -d 'Original/ABBA/Arrival/02 Dancing Queen.flac' -o 'Raw/ABBA/Arrival/02 Dancing Queen.wav'

但我希望这个命令可以在' Original'中的每个flac文件上运行。目录 - 递归。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用find递归列出文件。使用其-name过滤器仅获取flac个文件。

使用exec为找到的每个文件运行命令。 {}扩展了文件路径,您可以使用bash的Prameter Expansion从开头删除Original,并从每个文件路径的末尾删除flac

find Original -name '*.flac' -exec bash -c \
    'o="{}" ; r=Raw${o#Original} ; r=${r%flac}wav ; flac -d "$o" -o "$r"' \;

由于文件路径可以包含空格,不要忘记双引号变量。

如果你的路径包含双引号,那你就注定了。

答案 1 :(得分:-2)

简单

shopt -s globstar
ls ** | grep flac$

你可以把它放在for循环中,做你想做的事情