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

Bash: execute a command on all files with extension recursively

我正在尝试使用以下命令:

herbalizer file_name.haml > file_name.erb

这里的file_name.haml显然是文件名。

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

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

你很接近。您可以使用 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"' \;

您可以使用 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