1

我有一堆按顺序命名的 C 源文件(比如f1.c,f2.cf3.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 中让它工作?

4

4 回答 4

5

另一个解决方案,使用$(wildcard)查找 C 源代码和模式替换来获取派生文件名:

SOURCES := $(wildcard f[0-9]*.c)

clean :
    rm -f $(SOURCES:.c=)
    rm -rf $(SOURCES:.c=.dSYM)
于 2012-06-03T22:05:04.283 回答
4
ls | grep

是无用的使用lshttp://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

于 2012-06-03T21:44:39.370 回答
1

直接解决方案:引用您的正则表达式。更好的解决方案:glob、大括号扩展和/或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
于 2012-06-03T21:50:42.917 回答
0

您的命令行 shell 可能与make使用的 shell 不同。我猜你/bin/bash在命令行使用,但/bin/sh默认使用。您可以通过预先设置来更改它

SHELL=/bin/bash

到 Makefile。

在竖线和括号周围添加引号总是比不加引号更安全。另请注意,美元符号必须在 Makefile 中加倍,而不被视为特殊字符。

于 2012-06-03T21:45:07.700 回答