Answers:
你有没有尝试过
ls -U | head -4
这应该跳过排序,这可能就是为什么ls
要花这么长时间的原因。
ls -U
在打印之前不一定读取整个目录。strace -e getdents,write ls -U > /dev/null
例如,在大目录中尝试。
如果您使用的版本ls
可以不对文件进行排序(例如,-U
对于GNU ls),请使用它。如果没有选择,ls
将首先读取所有文件,然后对名称进行排序,然后开始打印。
另一种可能是运行find
,它会在找到名称时打印名称。
find . -name . -o -prune | head
(请注意,由于head
在line上工作,因此假定文件名不包含换行符)。
find
(而不是busybox或heirloom find
或GNU ls -U
),似乎在开始打印之前已读取整个目录。
也许您还需要其他工具ls
?
例如,Randal Schwartz有一个关于在大型目录上使用perl
的博客条目,其中可能包含一些有关构建满足您需求的提示。
在博客上发布兰德尔解释说,既ls
和find
尝试打印任何前请仔细阅读所有目录条目,而perl
他提出的解决方案不。
perl
可能使用readdir(3)
like ls
或find
。readdir(3)
在GNU / Linux的最新版本至少不会调用的getdents()
一个大的系统调用数(实际上通常不会通过减少系统数量优化性能调用正在取得)。但是在您的情况下,如果您要减少文件数量,则似乎必须绕过readdir
并使用BSD getdirentries(3)
或getdents(2)
系统调用。
如果不关心性能(例如在与该问题重复的问题中已关闭),并且您要在非以下列表中列出前n个文件(与输出的前n行相反ls
):通过文件名排序的隐藏文件,使用zsh
,您可以使用:
ls -ld -- *([1,4])
列出前4个文件。zsh
即使您告诉它不要排序,它仍然会读取目录的全部内容*(oN[1,4])
(请注意,它ls
也会对该列表进行排序)。
也许更少的产品更适合您的需求?
ls /usr/bin | less
对我来说,它可以立即在具有经典HDD的5岁笔记本电脑上工作,但速度却很快。
您可以使用less
提前终止q。
我猜您对1s延迟源的假设是错误的,但可能取决于您的Unix风格或shell,less或head命令。
在Linux上,使用GNU-ls,
ls -R /usr | less
开始为我立即输出,而整个输出正在运行又正在运行-因此,在开始更少之前,它肯定没有完成。您可以检查是否有1s或更长时间的恒定延迟,这取决于输出与否。
我猜您的1s延迟有不同的原因,也许HDD即将进入睡眠状态并需要唤醒?
您也有很少的文件这样的延迟吗?
ls
结果的执行量也会减少。我一直在寻找一种可以让ls限制结果数量的方法。
ls -lrth | tail
ls -lrth | tail -n 10
ls -lrth | grep *.gz | tail
ls
在bash 上使用命令。管道命令等grep
,head
,tail
或其他人的之后执行ls