我的目录中有大约 17k 个文件。当我运行 时ls directory
,我必须等待大约 15-20 秒才能显示结果。另一方面,当我运行ls directory | wc -l
或 时ls directory | grep .xyz
,结果会立即显示。
为什么会发生这种情况?有办法解决这个问题吗?
答案1
我猜你正在使用 Linux。
如果您的
ls
命令有别名,以便用彩色显示文件和文件夹,那么它需要找出每个项目的权限(stat() 调用)以及是否设置了任何“文件功能”(getxattr() 调用)才能选择正确的颜色。根据文件系统的不同,如果所需的元数据尚未缓存在 RAM 中,这些调用可能会相当慢。[扩展属性通常位于数据区域中,因此每个 getxattr 都会导致 HDD 寻道。]另一方面,
ls |
当重定向到管道时会自动禁用着色,因此不再需要进行任何额外的检查 - 只需一个简单的 readdir() 循环即可返回文件名和类型,并且内核甚至可能为此实现预读。废话
使用strace
或perf trace
检查哪些系统调用(如果有)需要很长时间。
答案2
ls
默认对输出进行排序。尝试ls -f
禁用排序和着色输出。
答案3
两件事情:
- 如果您
ls
先运行ls | wc -l
然后运行,前者可能会从您的硬盘读取数据,而后者可能会读取缓存数据。如果是这样,ls
最初会“停滞”并打印几秒钟。ls
只要缓存数据仍然存在,另一个就会几乎立即开始打印。如果您ls | wc -l
一开始就使用,它必须等待 HDD 提供数据。 - 任何终端都有自己的运行速度。正式地
stty speed
会显示一些值,但我认为这对虚拟终端来说并不重要。不过,显示字符和滚动需要时间(请参阅这个问题)。通过管道传递相同的数据速度更快。