如何在一定数量的结果后停止查找

时间:2015-10-09 06:49:17

标签: linux bash

我正在尝试确保特定目录至少有100个文件,每个文件至少1MB。搜索必须是递归的,因为有许多子目录。我不能等到我得到所有> 1Mb文件的列表,因为该目录有数百万个文件,而且需要很长时间。

所以我希望以下命令起作用:

find -size +1M | head -n 100

我的目录中有超过1Mb的大量文件,因此在head命令返回之前,应该只需几秒钟,前100行的列表。但它需要更长的时间。

如果我运行find -size +1M,则需要很短的时间才能获得很多结果。当它连续运行两次并且FS缓存是新鲜的时候更是如此。

所以我想知道为什么head一旦找到前100个文件就不会返回。

另一方面,如果省略“-size”参数,它可以正常工作:

find | head -n 100

立即返回100个文件的列表。

我正在使用内核3.2.0-4-amd64运行GNU / Linux Debian 7.4(Wheezy)。文件系统在单个RAID1阵列上的LVM卷之上是ext4。它有9638853使用inode(6%),容量为2.7 Tb和682 Gb免费。

1 个答案:

答案 0 :(得分:3)

这就是管道工作的方式。它等待直到输出find -size +1M填充管道缓冲区,然后将其传递给head -n 100,因此您实际上正在等待find命令填充通常为64千字节的管道缓冲区。 / p>

如果省略-size参数,结果会很快显示,只需花时间打印终端中的所有行,这样就会觉得需要更长的时间。

如果单独运行find -size +1M,则需要很短的时间才能获得很多结果,但所有结果却不会。如果你让它完成,你会发现它也需要很长时间。

您可以使用stdbuf修改某个命令的缓冲操作。例如,

stdbuf -oL -eL find -size +1M | head -n 10

将为你的命令行缓冲stdout和stderr,结果应该更快。