Bash:递归地对所有带扩展名的文件执行命令

时间:2016-07-20 11:48:36

标签: bash recursion find haml erb

我试图使用以下命令:

herbalizer file_name.haml > file_name.erb

显然,file_name.haml是文件名。

如何将此命令以递归方式应用于当前目录中的所有haml个文件到所有子目录?文件名应保持与上述相同,因此在abc.haml上应用herbalizer abc.haml > abc.erb

到目前为止:find . -type f -exec herbalizer {} \;

2 个答案:

答案 0 :(得分:3)

您可以使用basenamedirnamefind来获得所需的结果:

find . -type f -name "*.haml" | while read fname
> do
> herbalizer ${fname} > $(dirname $fname)/$(basename $fname .haml).erb
> done

@ Dummy00001评论部分建议的另一个简单方法是:

find . -type f -name "*.haml" | while read fname
> do
> herbalizer ${fname} > ${fname%.haml}.erb
> done

进一步参考:Parameter substitution

答案 1 :(得分:2)

你非常接近。您可以使用basename去除您找到的每个文件名称的扩展名:

find . -type f -name \*.haml -exec sh -c 'herbalizer "{}" > "$(dirname {})/$(basename {} .haml).erb"' \;

我将i / o重定向包装在shell命令行中。如果文件名或路径组件包含空格,则文件名用引号括起来。

PS。这让你完成了工作,但它不是很优雅;所以这是一个使用bash的内置替换的替代方案:

find . -type f -name \*.haml -exec bash -c 'FN="{}"; herbalizer "{}" > "${FN%.haml}.erb"' \;