如何限制ls打印的文件数量?


89

有没有办法限制ls命令中列出文件的数量?

我见过:

ls | head -4

但是要获取headtail要执行,我需要等待ls执行完成,并且目录中包含大量文件,这可能会花费大量时间。

我希望在ls不使用该head命令的情况下执行限制命令。

Answers:


109

你有没有尝试过

ls -U | head -4

这应该跳过排序,这可能就是为什么ls要花这么长时间的原因。

https://stackoverflow.com/questions/40193/quick-ls-command


“ ls -U”在打印之前仍会读取整个目录...我想我会写一个小脚本来限制文件,但是该问题链接是不错的阅读材料。谢谢妮可。
2011年

5
@ AndreDurao,GNU ls -U在打印之前不一定读取整个目录。strace -e getdents,write ls -U > /dev/null例如,在大目录中尝试。
斯特凡Chazelas

请注意:如果要在OSX上执行strace,请寻找dtrace,strace命令是Linux实用程序
AndreDurao

12

如果您使用的版本ls可以不对文件进行排序(例如,-U对于GNU ls),请使用它。如果没有选择,ls将首先读取所有文件,然后对名称进行排序,然后开始打印。

另一种可能是运行find,它会在找到名称时打印名称。

find . -name . -o -prune | head

(请注意,由于headline上工作,因此假定文件名不包含换行符)。


1
请注意,对于GNU find(而不是busybox或heirloom find或GNU ls -U),似乎在开始打印之前已读取整个目录。
斯特凡Chazelas

4

也许您还需要其他工具ls

例如,Randal Schwartz有一个关于在大型目录使用perl的博客条目,其中可能包含一些有关构建满足您需求的提示。

在博客上发布兰德尔解释说,既lsfind尝试打印任何前请仔细阅读所有目录条目,而perl他提出的解决方案不。


我还认为这可能是最好的选择,因为ls和find在打印之前都读取了整个目录。我正计划编写一个红宝石脚本来代替珍珠来做到这一点,感谢AFresh1!
AndreDurao 2011年

1
@AndreDurao,perl可能使用readdir(3)like lsfindreaddir(3)在GNU / Linux的最新版本至少不会调用的getdents()一个大的系统调用(实际上通常不会通过减少系统数量优化性能调用正在取得)。但是在您的情况下,如果您要减少文件数量,则似乎必须绕过readdir并使用BSD getdirentries(3)getdents(2)系统调用。
斯特凡Chazelas

3

如果不关心性能(例如在与该问题重复的问题中已关闭),并且您要在非以下列表中列出前n个文件(与输出的前n行相反ls):通过文件名排序的隐藏文件,使用zsh,您可以使用:

ls -ld -- *([1,4])

列出前4个文件。zsh即使您告诉它不要排序,它仍然会读取目录的全部内容*(oN[1,4])(请注意,它ls 也会对该列表进行排序)。


1

也许更少的产品更适合您的需求?

 ls /usr/bin | less

对我来说,它可以立即在具有经典HDD的5岁笔记本电脑上工作,但速度却很快。

您可以使用less提前终止q

我猜您对1s延迟源的假设是错误的,但可能取决于您的Unix风格或shell,less或head命令。

在Linux上,使用GNU-ls,

 ls -R /usr | less 

开始为我立即输出,而整个输出正在运行又正在运行-因此,在开始更少之前,它肯定没有完成。您可以检查是否有1s或更长时间的恒定延迟,这取决于输出与否。

我猜您的1s延迟有不同的原因,也许HDD即将进入睡眠状态并需要唤醒?

您也有很少的文件这样的延迟吗?


谢谢,但我不是想要这样的东西。就像head一样,整个ls结果的执行量也会减少。我一直在寻找一种可以让ls限制结果数量的方法。
AndreDurao 2012年

@AndreDurao:将我的评论移到了答案中。
用户未知

0
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail

我是抱歉Abhishek,但是这个问题的重点是ls在bash 上使用命令。管道命令等grepheadtail或其他人的之后执行ls
AndreDurao

0
$ cut -f 1,n filename

将完成获取第一个n文件的任务。 n是您要提取的文件数。因此完整的代码将是:

$ ls|cut -f 1,n file

1
ls | cut -f 1,n file您建议的命令将在输入的每行文本中输出第一个字段和第n个字段file,而将完全忽略的输出ls。这不能满足原始海报的需要。
telcoM

是的,您是正确的。头-n ...这肯定会完成任务。
拉曼迪普·辛格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.