我有一堆按顺序命名的C源文件(比如f1.c
,f2.c
,f3.c
等。
在我的Makefile中,我有一个clean:
定义,过去看起来像这样:
rm -f f1
rm -rf f1.dSYM
rm -f f2
rm -rf f2.dSYM
# etc
所以我想用正则表达式替换它,如果我直接将它输入命令行,这个效果很好:
ls | grep -P ^f[0-9]+(|\.dSYM)$ | xargs rm -rf
但是,如果我将该命令放在我的干净定义中,当我运行make clean
时,我得到了这个:
$ make clean
ls | grep -P ^f[0-9]+(|\.dSYM)| xargs rm -rf
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `ls | grep -P ^ex[0-9]+(|\.dSYM)| xargs rm -rf'
make: *** [clean] Error 2
我想我的正则表达式中有一些特殊字符导致语法错误...我试过引用和转义的东西,但没有什么真的有帮助,有没有人知道我怎样才能在Makefile中使用它?
答案 0 :(得分:5)
另一种解决方案,使用$(wildcard)
查找C源和模式替换以获取派生文件名:
SOURCES := $(wildcard f[0-9]*.c)
clean :
rm -f $(SOURCES:.c=)
rm -rf $(SOURCES:.c=.dSYM)
答案 1 :(得分:4)
ls | grep
是ls
无用的用法。 http://porkmail.org/era/unix/award.html#ls
rm -rf f[0-9] f[0-9]*[0-9] f[0-9]*.dSYM
清楚,使用 globing 。请参阅http://mywiki.wooledge.org/glob。
答案 2 :(得分:1)
直接解决方案:引用你的正则表达式。更好的解决方案:整体,支撑扩展和/或find ... -delete
。
rm -rf f{1,2}{,.dSYM}
rm -rf f? f?.dSYM
ffind . -regex '.*/f[0-9]' -o -regex '.*/f[0-9].dSYM' -delete
答案 3 :(得分:0)
您的命令行shell可能与shell make
使用的不同。我猜您在命令行使用/bin/bash
,但默认情况下使用/bin/sh
。您可以通过预先添加
SHELL=/bin/bash
到Makefile。
在竖线和括号周围添加引号总是比不引用它们更安全。另请注意,美元符号必须在Makefile中加倍,才能被视为特殊字符。