我想将两个参数传递给程序,一个文件名和文件名的修改版本。情况是我在目录树中有一堆 .html.erb 文件,我想html2haml
用原始文件名和带有 haml 扩展名的新输出文件名调用它们,如下所示:
html2haml thing.html.erb thing.html.haml
这是我目前最好的尝试:
find . -name "*.html.erb" -exec echo {} `echo {} | sed "s/.erb/.haml/g"` \;
(在我完成测试后,我将替换echo
为html2haml
并再次运行它)
但是它不起作用。反引号内的表达式的结果是未修改的字符串。
以下是我尝试的一些实验,它们的行为符合预期(测试我的语法和转义/引号的级别是否正确):
1. echo myfile.foo | sed 's/foo/foo2/g'
2. find . -name "*.html.erb" -exec echo {} `echo xyz | sed "s/y/Y/g"` \;
3. find . -name "*.html.erb" -exec echo {} `echo {} hello` \;
4. find . -name "*.html.erb" -exec echo {} `echo {}` \;
这些都按预期运行的事实向我表明,我在语法中遇到了一些小错误,而这确实可以用单行来做到这一点。
如果这是不可能的,那可能是因为对“何时”find 在每次调用时插入其结果的误解。上面的示例#3 向我建议它在我需要/期望它时执行它(因为我成功地将每个单独的结果字符串与“hello”连接起来)。