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"' \;
您可以使用 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
我正在尝试使用以下命令:
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"' \;
您可以使用 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