统计大文件夹中文件的快速方法

统计大文件夹中文件的快速方法

我想统计一个文件夹中的文件数量,但是文件太多了,所以ls -1 | wc -l需要几分钟的时间。有没有更快的方法?最好是复杂度较低的方法?

我更喜欢可以从命令行运行的解决方案,但其他解决方案仍然有帮助。

编辑:上述解决方案根本不起作用:

$ ls -1 | wc -l
ls: memory exhausted
0

答案1

使用查找和计数的一种方法:

find . -type f | wc -l

答案2

也许可以问 Python:

python -c "import glob; print len(glob.glob('*'))"

笔记:

  • 模式外面用双引号,模式周围用单引号,反之亦然。
  • 模式可以包含路径:'/tmp/*'

我很好奇,想知道哪个与之相比更快find,我无法创建足够大的目录来进行合理的测量。

当然这也有可能发生OOM...

编辑:使用近 1M 个文件进行了测试tmpfs

▶▶time python -c "import glob; print len(glob.glob('*'))"
999990

real    0m0.774s
user    0m0.471s
sys     0m0.303s
▶▶time find . | wc -l
999992

real    0m0.522s
user    0m0.231s
sys     0m0.324s

所以find速度更快。顺便说一句,当它工作时,ls比两者都慢得多。

答案3

我确实尝试了一些使用 zshtime函数的建议:

$ time ./getdents keys | wc -l
15228414
./getdents keys  0,29s user 4,34s system 91% cpu 5,061 total
wc -l  0,11s user 0,13s system 4% cpu 5,061 total


$ time find keys -type f | wc -l
19144815
find keys -type f  10,38s user 7,82s system 3% cpu 7:42,05 total
wc -l  0,21s user 0,25s system 0% cpu 7:42,08 total


$ time ls -1 -U keys | wc -l
16986019
ls --color=tty -1 -U keys  3,88s user 6,69s system 2% cpu 7:53,60 total
wc -l  0,21s user 0,22s system 0% cpu 7:53,60 total


$ time python -c "import glob; print len(glob.glob('*'))"
17750179
python -c "import glob; print len(glob.glob('*'))"  8,20s user 12,37s system 1% cpu 32:00,29 total

他们报告的数字不同,因为我同时从大目录中复制文件(并且 find 命令还列出了子目录中的文件,可以使用 进行修复-maxdepth=1),并且没有同时启动所有程序。但是,总体趋势清晰可见。第一个是 C 变体,在此主题链接自编码

相关内容