我必须得到一个包含大约200万个文件的目录列表,但是当我ls
对它执行命令时,什么都没有回来.我等了3个小时.我试过了ls | tee directory.txt
,但这似乎永远挂了.
我假设服务器正在进行大量的inode排序.有没有办法加快ls
命令只是获取文件名的目录列表?我此时并不关心大小,日期,许可等.
ls -U
会做没有排序的ls.
尝试使用:
find . -type f -maxdepth 1
这将只列出目录中的文件,-type f
如果要列出文件和目录,请省略参数.
这个问题似乎很有趣,我正在经历多个已发布的答案.为了理解发布的答案的效率,我已经在200万个文件上执行了它们,并找到了如下结果.
$ time tar cvf /dev/null . &> /tmp/file-count real 37m16.553s user 0m11.525s sys 0m41.291s ------------------------------------------------------ $ time echo ./* &> /tmp/file-count real 0m50.808s user 0m49.291s sys 0m1.404s ------------------------------------------------------ $ time ls &> /tmp/file-count real 0m42.167s user 0m40.323s sys 0m1.648s ------------------------------------------------------ $ time find . &> /tmp/file-count real 0m2.738s user 0m1.044s sys 0m1.684s ------------------------------------------------------ $ time ls -U &> /tmp/file-count real 0m2.494s user 0m0.848s sys 0m1.452s ------------------------------------------------------ $ time ls -f &> /tmp/file-count real 0m2.313s user 0m0.856s sys 0m1.448s ------------------------------------------------------
总结结果
ls -f
命令运行速度比ls -U
.禁用颜色可能会导致这种改进.
find
命令运行第三,平均速度为2.738秒.
跑步只ls
花了42.16秒.在我的系统中ls
是别名ls --color=auto
使用shell扩展功能echo ./*
运行50.80秒.
而tar
基础的解决方案用了大约37 miuntes.
当系统处于怠速状态时,所有测试都是单独进行的.
这里要注意的一件重要事情是,文件列表不会在终端中打印,而是被重定向到文件,文件计数稍后会通过wc
命令计算出来.如果输出在屏幕上打印,则命令运行得太慢.
任何想法为什么会这样?
我有一个包含400万个文件的目录,而我得到ls立即吐出文件而没有太多麻烦的唯一方法是
ls -1U
使用
ls -1 -f
速度大约快10倍,而且操作简单(我测试了100万个文件,但最初的问题有6 800000000个文件)
但就我而言,我需要检查某个特定目录是否包含超过10 000个文件。如果有超过10 000个文件,那么我不再对有多少文件感兴趣。我只是退出程序,以便它运行更快,并且不会尝试一一阅读其余的程序。如果少于一万,我将打印准确的金额。如果您为参数指定的值大于文件数量,则我的程序的速度与ls -1 -f非常相似。
您可以通过键入以下命令在当前目录中使用我的程序find_if_more.pl:
find_if_more.pl 999999999
如果您只是想知道文件数是否大于n,脚本将比ls -1 -f处理大量文件的速度更快。
#!/usr/bin/perl use warnings; my ($maxcount) = @ARGV; my $dir = '.'; $filecount = 0; if (not defined $maxcount) { die "Need maxcount\n"; } opendir(DIR, $dir) or die $!; while (my $file = readdir(DIR)) { $filecount = $filecount + 1; last if $filecount> $maxcount } print $filecount; closedir(DIR); exit 0;