1

I want to go through a set of files in makefile:

alltest:    all
            for f in $(FILES); do \
                echo $$f; \
            done

I want to write $(FILES) such that it regards the files of /abc/*.txt which do not contain ERROR1 or ERROR2 in their body.

Too look for a set of files which contain ERROR1 or ERROR2 in their body, I use find -iname '/abc/*.txt' | xargs grep -e "ERROR1" -e "ERROR2"

Could anyone tell me how to do the complement of the set, also how to integrate the shell command into the makefile?

4

1 回答 1

2

首先要做的事情……这是否符合您的想法和要求?

find -iname '/abc/*.txt'

它在我的子目录中找不到文件(在 Mac OS X 10.8.5 上)。Wherefind . -iname '*.txt'找到一些文件,find . -iname '/path/*.txt不产生任何输出,-ipath. 但是,find . -ipath '*/path/*.txt'确实会生成文件列表。因此,我们暂时将您的find命令更正为:

find . -ipath '*/abc/*.txt'

接下来,您运行:

xargs grep -e "ERROR1" -e "ERROR2"

这将产生包含文件名称和消息名称的行。如果您想要包含匹配项的文件的名称,则需要添加-l到命令中:

find . -ipath '*/abc/*.txt' |
xargs grep -l -e "ERROR1" -e "ERROR2"

但是,您只想列出不匹配的文件。为此,如果您有 GNU grep,则可以使用以下-L选项:

find . -ipath '*/abc/*.txt' |
xargs grep -L -e "ERROR1" -e "ERROR2"

如果您没有 GNU grep,那么您必须更加努力地工作:

find . -ipath '*/abc/*.txt' |
tee file.names |
xargs grep -l -e "ERROR1" -e "ERROR2" > matching.file.names
comm -23 file.names matching.file.names

tee命令捕获文件中文件名列表的副本file.names(如原创性)。该grep命令捕获matching.file.names. 名称在两个文件中的顺序相同。出现file.names但未出现matching.file.names的就是你想要的。默认情况下,该comm file.names matching.file.names命令将打印 3 列:仅在第一个文件中找到的行,仅在第二个文件中找到的行,以及在两个文件中找到的行。通过使用该-23选项抑制第 2 列和第 3 列的输出,我们仅获得第一个文件中未在另一个文件中找到的名称——这是您想要的列表。

您从那里获取列表由您决定......</p>

于 2013-09-22T05:06:15.607 回答