如何在Makefile中移动名称包含$1的文件
如何在Makefile中处理包含
$1的文件名? 嘿,这个问题我熟!在Makefile里,$是个特殊角色——它用来引用内置变量(比如$@代表目标文件)或者位置参数。如果直接写$1,Make会把它当成自己的参数解析,而不是你想要的文件名里的字面$1。解决办法很简单:用两个$$来转义单个$。
具体实现示例
假设你要把所有名称里包含$1的文件(比如file$1.txt)移动到target_dir目录下,你的Makefile规则可以这么写:
# 移动所有含$1的文件到目标目录 move-special-files: # 匹配任意位置包含$1的文件,用$$转义$ mv *'$$1'* target_dir/
或者如果你明确知道$1在文件名的某个位置(比如后缀前),也可以写得更精准:
move-specific-files: mv 'file$$1.txt' target_dir/
原理说明
当Make解析这行命令时,会把$$替换成单个$,所以最终传递给shell执行的命令是mv *'$1'* target_dir/——这时候shell就会正确识别文件名里的$1,不会把它当成自己的位置参数处理。
小提示
如果你的文件名里还有空格、引号这类shell特殊字符,记得用单引号把文件名模式括起来,避免shell解析出错,就像上面例子里的'$$1'那样,既能让Make正确转义$,又能让shell按字面处理文件名。
内容的提问来源于stack exchange,提问作者Israel P
相关产品推荐
相关产品推荐

