考虑使用比find
命令更快的locate
命令。
在测试数据上运行
$ 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 answer中的回答,帮助我解决了文件计数中的符号链接问题。
感谢Terdon在
Unix & Linux answer中提供的
$PWD
的答案(虽然不是针对我)。
原始答案如下,参考评论
简略版:
$ 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$"
在当前目录及其子目录($PWD
)中定位所有.c
文件。使用-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中。注意,locate知道一切!
有趣的计数:
$ 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秒。结果可能因人而异。
关于locate
命令的正则表达式处理的详细说明(在这个问答中似乎不需要,但以防万一)请阅读此文档:在特定目录下使用"locate"命令?
最近文章的额外阅读: