'ls' 命令很慢

tyt*_*win 5 terminal ls

我在一个目录中有大约 17k 个文件。当我运行时ls directory,我必须等待大约 15-20 秒才能显示结果。另一方面,当我运行ls directory | wc -lor 时ls directory | grep .xyz,结果会立即显示。

为什么会发生这种情况,有没有办法解决这个问题?

use*_*686 8

我猜你正在使用 Linux。

  1. 如果您的ls命令具有别名以便以颜色显示文件和文件夹,那么它需要按顺序找出每个项目的权限(stat() 调用)以及它是否具有任何“文件功能”集(getxattr() 调用)选择正确的颜色。根据文件系统,如果所需的元数据尚未缓存在 RAM 中,这些调用可能会相当慢。[扩展属性通常存在于数据区中,因此每个 getxattr 都会导致 HDD 搜索。]

    另一方面,ls |当重定向到管道时会自动禁用着色,所以它不再需要做任何额外的检查——只是一个简单的 readdir() 循环,它返回文件名和类型,内核甚至可能实现预读那。

  2. 通常ls将其输出分列,这意味着它必须先读取整个目录,然后才能输出任何内容。当通过管道运行时,它会自动禁用列模式并且不再需要这种缓冲。(总运行时间不一定更快,但输出开始得更早,让它感觉更灵敏。)

使用straceperf trace检查哪些系统调用(如果有)花费了很长时间。