linux - 如何在达到一定数量的结果后停止查找

标签 linux bash

我试图确保特定目录至少包含 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/

相关文章:

linux - 在 Linux VM (RHEL) 上安装 Git

regex - 使用任何扩展名重命名 perl 文件

linux - 如何从 shell 中的三个中随机选择第一台机器?

bash - 在Docker中运行两个可执行文件

linux - 在 Bash 中使用函数进行反转

php - 关于定期任务

linux - cd ./命令在 Bash 中究竟是如何工作的?

bash - 使用 bash 我需要在文件名中的文件扩展名之前删除尾随空格

linux - XLookupString 返回 UTF-8 代码(Latin-1 到 UTF-8)

linux - 在 Linux 中将许多 CSV 文件拆分成几个更大的文件