如何编写命令统计当前目录普通文件的扩展名数量并排除无扩展名文件
问题根源
你现在的统计结果混进无扩展名文件,本质是sed的替换规则有漏判:
- 原命令里的
sed 's/.*\.//',只会在路径存在.的情况下,把最后一个.之前的内容删掉,留下后面的扩展名 - 碰到
bar、foo这类文件名里完全没有.的文件时,sed找不到匹配的替换目标,会把原文件路径原样输出,最终就成了你看到的/bar、/foo这类无效统计项
调整后的可用命令
只需要加一层校验,把没有真实扩展名的条目过滤掉就行,两种可以直接跑的实现:
方法1:优化sed匹配逻辑
把原sed命令换成带校验的提取规则,只输出有真实扩展名的条目:
find . -type f | sed -n 's/.*\.\([^/]*\)$/\1/p' | sort | uniq -c
这个写法用-n参数默认不输出内容,只有匹配到「路径末尾带.、后面跟扩展名」的格式时,才会提取扩展名并打印,无扩展名的文件会直接被过滤,不会进入后续统计。
方法2:在find阶段提前筛选
直接让find只把带.的普通文件传给后续流程:
find . -type f -regex '.*\..*' | sed 's/.*\.//' | sort | uniq -c
实际运行效果
在你给出的测试目录下跑上述任意命令,都会得到和预期完全一致的输出:
1 lst 4 sh
注意:这套逻辑不会把
.gitignore这类仅以.开头、没有实际扩展名的隐藏文件误算成带扩展名的文件,完全匹配“忽略无扩展名文件”的需求。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

