我试图在一个包含 200K .eml(纯文本)文件的目录中收集所有 Message-ID: 标头(行)。我有点天真地说:
find -type f -exec grep -Fi "message-id:" {} \; > messageids.txt
我让它运行了一整夜,因为我认为 grep 这么多文件需要一段时间。今天早上让我有点惊讶的是,messageids.txt 有 1.7TB,而我的分区已满。我意识到一定发生了什么,因为 grep 自己的输出被当作输入,但我不会(现在仍然不会,直觉上)期望它会无休止地重复。这意味着我对起作用的力量的理解还不够深刻。
有人能详细解释一下上面的命令是如何工作的,以及为什么(我认为)会出现这个无限循环吗?谢谢。
更新:我期望它的工作方式是 find 找到一个文件列表,然后对每个文件调用 grep。因此,在某个时候,会在 messageids.txt 上调用 grep。如果我在 sort 命令上执行此操作,则在命令执行后会立即创建 messageids.txt(如果已存在,则可能会破坏它),但直到命令完成才会填充它。在这种情况下,为了使循环无限,必须在输出完成之前填充文件,但要使 grep 的输入始终保持同步。这一点与我的预期不符,我希望详细解释此进程链的执行方式,以便巩固我的 Linux 基础知识。
答案1
每次它发现message-id
其中有 的行时,它都会很快将其写入messageids.txt
。每次它发现message-id
其中有 的行时messageids.txt
,它都会很快找到 。所以这是一个微不足道的无限循环。
答案2
我刚刚测试了类似的东西并且它有效。
for f in $(find . -type f); do grep -Fi "message-id:" $f > messageids.txt; done