我想统计一个文件夹中的文件数量,但是文件太多了,所以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 变体,在此主题链接自编码。