我试图使用以下命令:
herbalizer file_name.haml > file_name.erb
显然,file_name.haml
是文件名。
如何将此命令以递归方式应用于当前目录中的所有haml
个文件到所有子目录?文件名应保持与上述相同,因此在abc.haml
上应用herbalizer abc.haml > abc.erb
到目前为止:find . -type f -exec herbalizer {} \;
答案 0 :(得分:3)
您可以使用basename
,dirname
和find
来获得所需的结果:
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"' \;