‘ls’ 命令非常慢

‘ls’ 命令非常慢

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

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

答案1

我猜你正在使用 Linux。

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

    另一方面,ls |当重定向到管道时会自动禁用着色,因此不再需要进行任何额外的检查 - 只需一个简单的 readdir() 循环即可返回文件名和类型,并且内核甚至可能为此实现预读。

  2. 废话

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

答案2

ls默认对输出进行排序。尝试ls -f禁用排序和着色输出。

答案3

两件事情:

  1. 如果您ls先运行ls | wc -l然后运行,前者可能会从您的硬盘读取数据,而后者可能会读取缓存数据。如果是这样,ls最初会“停滞”并打印几秒钟。ls只要缓存数据仍然存在,另一个就会几乎立即开始打印。如果您ls | wc -l一开始就使用,必须等待 HDD 提供数据。
  2. 任何终端都有自己的运行速度。正式地stty speed会显示一些值,但我认为这对虚拟终端来说并不重要。不过,显示字符和滚动需要时间(请参阅这个问题)。通过管道传递相同的数据速度更快。

相关内容