我试图确保特定目录至少包含 100 个文件,每个文件至少 1MB。搜索必须是递归的,因为有很多子目录。我迫不及待地想要获得所有 >1Mb 文件的列表,因为该目录有数百万个文件,而且需要很长时间。
所以我希望以下命令能够工作:
find -size +1M | head -n 100
我的目录中有大量超过 1Mb 的文件,因此只需几秒钟,head
命令就会返回前 100 行的列表。但需要更长的时间。
如果我运行find -size +1M
,则需要很短的时间才能获得许多结果。当它连续运行两次并且 FS 缓存是新鲜的时更是如此。
所以我想知道为什么 head
在找到前 100 个文件后不立即返回。
另一方面,如果我省略“-size”参数,它就可以正常工作:
查找|头-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。
最佳答案
这就是管道的工作原理。它会等到 find -size +1M
的输出填满管道缓冲区,然后通过管道将其传送到 head -n 100
,因此您实际上正在等待 find
命令填充管道缓冲区,通常为 64 KB。
当您省略 -size
参数时,结果很快就会出来,只是需要一些时间来打印终端中的所有行,因此会被认为需要更长的时间。
如果单独运行find -size +1M
,则需要很短的时间才能获得许多结果,但不是全部结果。如果让它运行到完成,您会发现它也需要很长时间。
您可以使用stdbuf
修改特定命令的缓冲操作。例如,
stdbuf -oL -eL find -size +1M | head -n 10
将为您的命令对 stdout 和 stderr 进行行缓冲,结果应该会更快地出现。
关于linux - 如何在达到一定数量的结果后停止查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33031684/