为什么在包含许多文件的目录上执行“ls -U”需要一些时间,而执行“ls -U | head”却立即返回答案?

为什么在包含许多文件的目录上执行“ls -U”需要一些时间,而执行“ls -U | head”却立即返回答案?

当你想要从包含许多文件的目录中获取文件名样本时,建议执行“ls -U | head”,因为否则单独执行“ls”可能会花费相当长的时间。

但是,为什么“ls -U”本身在运行时没有立即开始返回输出?

答案1

GNU ls -U 表示未分类的输出,因此它不需要等待所有目录内容才开始打印它们。

head 将在几行之后关闭 stdin 并退出。当管道的写入器(在本例中为 ls)没有更多读取器时,它将退出。这将在几行之后刷新所有相关的 I/O,使其在交互式使用中显得敏捷。

进一步阅读:标准输入关闭时进程未关闭


列出目录内容时,如果人类能明显感觉到延迟,则表明超出了实际限制。目录中有大量文件意味着文件系统元数据很大,因此需要大量 I/O。大量通常意味着数十万个文件,即使对于经过生产测试的文件系统也是如此。

如果文件数量超过一定数量,则有必要重新考虑替代目录布局和数据库。短期内,将问题卷放在快速 SSD 上,以使其性能可以接受。

相关内容