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

我见过:

ls | head -4


但是得到head或要执行的tail,我需要等待ls完成执行,
以及目录中包含大量文件的文件,这些文件可能会花费大量时间。

我希望执行一个ls命令,限制而不使用该head命令。

#1 楼

您是否尝试过

ls -U | head -4


这应该跳过排序,这可能就是为什么ls花这么长时间的原因。
https:// stackoverflow。 com / questions / 40193 / quick-ls-command

评论


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

– AndreDurao
2011年9月27日下午16:43

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

–StéphaneChazelas
2015年5月14日15:58



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

– AndreDurao
17年4月28日在14:28

#2 楼

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

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

find . -name . -o -prune | head


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

评论


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

–StéphaneChazelas
15年5月14日在16:11

#3 楼

也许您还需要ls以外的工具?例如,Randal Schwartz的博客条目涉及在大型目录上使用perl,可能包含一些提示,以构建满足您需求的内容。

在Randal的博客中,他解释说lsfind都试图在打印任何目录条目之前先读取所有目录条目,而他提出的perl解决方案则没有。

评论


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

– AndreDurao
2011年9月27日在16:37

@ AndreDurao,perl可能像ls或find一样使用readdir(3)。在当前版本的GNU / Linux上,readdir(3)至少确实调用了大量的getdents()系统调用(实际上,它实际上通过减少进行的系统调用次数来优化性能)。但是在您的情况下,如果您希望减少文件数量,则似乎必须绕过readdir并使用BSD的getdirentries(3)或getdents(2)系统调用代替。

–StéphaneChazelas
2015年5月14日下午16:35

#4 楼

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

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


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

#5 楼

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

 ls /usr/bin | less


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

您可以提前终止less

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

在具有GNU-ls的Linux上,

 ls -R /usr | less 


开始为我立即输出,而整个输出在运行而在运行-因此最终还没结束,就更少了。您可以检查是否有1s或更长时间的恒定延迟,具体取决于输出与否。

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

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

评论


谢谢,但我不是想要这样的东西。就像head一样,整个ls结果的结果也会执行得更少。我一直在寻找一种方法来限制结果数量。

– AndreDurao
2012年1月24日上午11:40

@AndreDurao:将我的评论移到了答案中。

–用户未知
2012年1月25日16:05

#6 楼

ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail


评论


我是抱歉Abhishek,但是这个问题的重点是在bash上使用ls命令。诸如grep,head,tail或其他的管道命令在ls之后执行

– AndreDurao
16年4月4日在11:51

#7 楼

$ cut -f 1,n filename


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

$ ls|cut -f 1,n file


评论


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

–telcoM
18年5月29日在7:45

是的,您是正确的。头-n ...这肯定会完成任务。

–拉曼德·辛格(Ramandeep Singh)
18年5月30日在8:48