ls
命令上列出的文件数量?我见过:
ls | head -4
但是得到
head
或要执行的tail
,我需要等待ls
完成执行,以及目录中包含大量文件的文件,这些文件可能会花费大量时间。
我希望执行一个
ls
命令,限制而不使用该head
命令。#1 楼
您是否尝试过ls -U | head -4
这应该跳过排序,这可能就是为什么
ls
花这么长时间的原因。https:// stackoverflow。 com / questions / 40193 / quick-ls-command
#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的博客中,他解释说
ls
和find
都试图在打印任何目录条目之前先读取所有目录条目,而他提出的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
评论
“ 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