【问题标题】:Loop through files which do not contain certain texts in makefile循环遍历 makefile 中不包含某些文本的文件
【发布时间】:2013-09-22 13:06:15
【问题描述】:

我想浏览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中?

【问题讨论】:

  • make 中执行此操作之前,您将如何在shell 中执行此操作?你试过什么?
  • 我只是编辑了一点代码...在shell中,我只偶尔使用grep...查找文件的命令对我来说太复杂了...跨度>
  • shell 是一种编程语言——相当适合程序对文件的操作。你用哪种语言编程?想想你会用那种语言做什么。假设您可以生成文件名列表。您如何找到正文中包含 ERROR4 的文件(提示:grep 带有选项可以告诉您)?您将如何从列表中删除名称(提示:comm 可以比较已排序的值列表)?如何在第 1 行找到包含 ERROR1ERROR2ERROR3 的文件?这可能是最艰巨的任务。如何从列表中删除这些文件。
  • 你有 GNU grep 吗?您是否查看过它的选项列表(相当广泛:grep --help)?否定(不包含错误,尤其是在特定行上)相对难以处理。但是您至少可以考虑如何编写一个 shell 脚本,给定一个名称列表,返回一个符合您条件的名称列表。然后你可以把它放在你的$PATHbin 目录中,然后在你的makefile 中使用它,不是吗?
  • 我只是修改了一点OP...

标签: bash shell makefile find


【解决方案1】:

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

find -iname '/abc/*.txt'

它在我的子目录中找不到文件(在 Mac OS X 10.8.5 上)。在find . -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 列的输出,我们仅获得第一个文件中未在另一个文件中找到的名称——这是您想要的列表。

从哪里获取列表由您决定……

【讨论】:

  • 感谢您的回答。在我为find . -ipath ...中的f写的那一刻,你知道如何为find . -ipath ...创建一个变量,以便结构看起来更好吗?
  • 我只是意识到它不能完美运行,您对此有什么想法:stackoverflow.com/questions/18948227/an-odd-behavior-of-find
  • 有趣的是,当有关此评论的通知到达时,我正在查看该问题...我会回去查看它。有各种各样的事情可能需要解决。这是一个解决方案的“注释”,而不是生产就绪的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多