Makefile中文件重命名命令无法捕获正则表达式问题排查
问题根源与解决办法
你碰到的这个坑其实是Makefile的一个常见特性:它会优先解析所有以$开头的字符,把它们当作自己的变量或位置参数。
你在Shell里正常工作的$1和$2,到了Makefile里就被当成了Make的变量——而你根本没定义过这些变量,所以Make展开后直接把它们替换成了空字符串。这就导致你的正则替换式里的/var/www/project/src/assets/img/magazines/$1/$2/变成了/var/www/project/src/assets/img/magazines///,最终输出的路径就全乱了。
解决方法:用$$转义$符号
要让$1和$2原封不动地传递给Shell里的rename命令,你需要在Makefile里把每个$换成两个$(也就是$$)。Make在解析的时候会把$$转换成单个$,这样到了Shell层面就变成了正则需要的捕获组引用。
修改后的Makefile规则如下:
magazines-rename-script-dry: find /var/www/project/src/assets/img/magazines/ -depth -exec rename -n 's//var/www/project/src/assets/img/magazines/([a-z]+)/([0-9]+).*-//var/www/project/src/assets/img/magazines/$$1/$$2//' {} +
验证效果
执行make magazines-rename-script-dry后,Make会把命令里的$$1展开成$1,$$2展开成$2,最终传递给rename的命令就和你在Shell里直接执行的完全一致,正则捕获组就能正常捕获语言标识和数字编号,输出正确的重命名结果了。
内容的提问来源于stack exchange,提问作者Marc Pont
相关产品推荐
相关产品推荐

