循环遍历makefile中不包含某些文本的文件

时间:2013-09-22 03:09:15

标签: bash shell makefile find

我想查看makefile中的一组文件:

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

我想写$(FILES),以便它认为/abc/*.txt的文件在其正文中不包含ERROR1ERROR2

要查找其中包含ERROR1ERROR2的一组文件,我使用find -iname '/abc/*.txt' | xargs grep -e "ERROR1" -e "ERROR2"

有人能告诉我如何补充集合,还有如何将shell命令集成到makefile中?

1 个答案:

答案 0 :(得分:2)

首先要做的事情......这会做你想的和想要的吗?

find -iname '/abc/*.txt'

它在我的子目录中找不到文件(在Mac OS X 10.8.5上)。 find . -iname '*.txt'找到某些文件的地方,find . -iname '/path/*.txt没有输出,-ipath也没有。{1}}。但是,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列的输出,我们只获得第一个文件中未在另一个文件中找到的名称 - 这是您想要的列表。

你从那里拿到名单取决于你...