获取目录的所有扩展名:简单。获取特定扩展名的文件计数:简单。
但是获取所有文件扩展名及其各自的文件计数对我来说很困难。
例如。
+ dir
+ abc.txt
+ def.txt
+ abc.pdf
* def.pov
应该返回类似这样的内容:
.txt 2
.pdf 1
.pov 1
本次练习的目的是我想要找出在某个目录中哪种文件扩展名最流行。
提前致谢
答案1
/var/cache$ sudo find ./ -type f | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq -c | sort -n
1 .6
1 .cache
1 .noconf
1 .php
1 .sl
2 .bin
2 .el
2 .tdb
4 .baseA
4 .baseB
4 .dat
4 .DB
27 .db
221 .deb
以下是解释:
find ./ -type f
仅查找文件,不查找目录
grep -E ".*\.[a-zA-Z0-9]*$"
过滤文件扩展名
sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/'
删除路径和文件名,仅保存扩展名
sort | uniq -c | sort -n
sort、uniq 和 sort
答案2
-P
由于您使用的是 Linux (gnu grep),因此现在是使用 Perl REs (PCRE)和 grep选项的好时机-o
。以 @bindbn 的答案作为一个很好的候选:
find . -type f | grep -Po '\.([\w\d])*$' | sort | uniq -c | sort -n
答案3
我刚刚遇到了同样的问题并想出了这个解决方案:
find . -type f | rev | cut -d "." -f 1 | rev | sort | uniq -c | sort -n
这与这里提出的其他解决方案非常相似,但可能更容易理解/记住,而且可能速度稍快一些。它还避免了文件名包含特殊字符的常见麻烦。
rev | cut -d "." -f 1 | rev
反转文件名字符串,提取(反转的)文件扩展名直到“。”分隔符,并反转扩展名子字符串,然后sort | uniq -c | sort -n
计算每个扩展名的实例并按匹配的升序打印结果。