我想查看makefile
中的一组文件:
alltest: all
for f in $(FILES); do \
echo $$f; \
done
我想写$(FILES)
,以便它认为/abc/*.txt
的文件在其正文中不包含ERROR1
或ERROR2
。
要查找其中包含ERROR1
或ERROR2
的一组文件,我使用find -iname '/abc/*.txt' | xargs grep -e "ERROR1" -e "ERROR2"
有人能告诉我如何补充集合,还有如何将shell命令集成到makefile中?
答案 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列的输出,我们只获得第一个文件中未在另一个文件中找到的名称 - 这是您想要的列表。
你从那里拿到名单取决于你...