考虑使用locate
比find
命令快得多的命令。
运行测试数据
$ sudo updatedb # necessary if files in focus were added `cron` daily.
$ printf "Number Files: " && locate -0r "$PWD.*\.c$" | xargs -0 -I{} sh -c 'test ! -L "$1" && echo "regular file"' _ {} | wc -l && printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -cu | wc -l
Number Files: 29
Number Dirs.: 7
感谢Muru的回答,以帮助我从Unix&Linux回答中消除符号链接的文件数量。
感谢Terdon $PWD
在Unix&Linux answer中对(不是针对我的)回答。
以下评论引用了原始答案
简写:
$ cd /
$ sudo updatedb
$ printf "Number Files: " && locate -cr "$PWD.*\.c$"
Number Files: 3523
$ printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l
Number Dirs.: 648
sudo updatedb
locate
如果.c
今天创建了文件或.c
今天删除了文件,则更新命令使用的数据库。
locate -cr "$PWD.*\.c$"
.c
在当前目录及其子目录($PWD
)中找到所有文件。而不是打印文件名,并使用-c
参数打印计数。在r
指定的正则表达式,而不是默认的*pattern*
匹配可产生过多的结果。
locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l
。*.c
在当前目录和下面找到所有文件。删除文件名,sed
仅保留目录名。使用计数每个目录中的文件数uniq -c
。用计数目录数wc -l
。
从单行开始于当前目录
$ cd /usr/src
$ printf "Number Files: " && locate -cr "$PWD.*\.c$" && printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l
Number Files: 3430
Number Dirs.: 624
请注意文件计数和目录计数如何更改。我相信所有用户都有该/usr/src
目录,并且可以根据已安装内核的数量使用不同的计数运行以上命令。
长表:
长格式包括时间,所以你可以看到有多少快locate
结束了find
。即使必须运行,sudo updatedb
它也比单个运行速度快许多倍find /
。
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ sudo time updatedb
0.58user 1.32system 0:03.94elapsed 48%CPU (0avgtext+0avgdata 7568maxresident)k
48inputs+131920outputs (1major+3562minor)pagefaults 0swaps
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Files: " && locate -cr $PWD".*\.c$")
Number Files: 3523
real 0m0.775s
user 0m0.766s
sys 0m0.012s
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Dirs.: " && locate -r $PWD".*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l)
Number Dirs.: 648
real 0m0.778s
user 0m0.788s
sys 0m0.027s
───────────────────────────────────────────────────────────────────────────────────────────
注:这是对所有的文件全部驱动器和分区。即我们也可以搜索Windows命令:
$ time (printf "Number Files: " && locate *.exe -c)
Number Files: 6541
real 0m0.946s
user 0m0.761s
sys 0m0.060s
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Dirs.: " && locate *.exe | sed 's%/[^/]*$%/%' | uniq -c | wc -l)
Number Dirs.: 3394
real 0m0.942s
user 0m0.803s
sys 0m0.092s
我有三个Windows 10 NTFS分区自动安装在中/etc/fstab
。要知道找到一切!
有趣的计数:
$ time (printf "Number Files: " && locate / -c && printf "Number Dirs.: " && locate / | sed 's%/[^/]*$%/%' | uniq -c | wc -l)
Number Files: 1637135
Number Dirs.: 286705
real 0m15.460s
user 0m13.471s
sys 0m2.786s
计算286,705个目录中的1,637,135个文件需要15秒。YMMV。
有关locate
命令的正则表达式处理的详细分类(在本问答中似乎不需要,但以防万一,请仔细阅读):在某些特定目录下使用“定位”?
最近文章的补充阅读: