我想计算目录中每个扩展名的文件数量以及没有扩展名的文件数量。
我尝试了几种方法,但还没有找到可行的解决方案:
find "$folder" -type f | sed 's/.*\.//' | sort | uniq -c
是一个选项,但如果没有文件扩展名,则不起作用。我需要知道有多少文件没有扩展名。我也尝试过在数组中查找循环,然后对结果求和,但此时该代码会引发未声明的变量错误,但仅限于循环之外:
declare -a arr arr=() echo ${arr[@]}
一旦查找循环完成,这将抛出一个未声明的变量。
答案1
find "$path" -type f | sed -e '/.*\/[^\/]*\.[^\/]*$/!s/.*/(none)/' -e 's/.*\.//' | LC_COLLATE=C sort | uniq -c
解释:
find "$path" -type f
获取文件夹中所有文件的递归列表"$path"
。sed -e '/.*\/[^\/]*\.[^\/]*$/!s/.*/(none)/' -e 's/.*\.//'
常用表达:/.*\/[^\/]*\.[^\/]*$/!s/.*/(none)/
将所有不带扩展名的文件替换为 (none)。s/.*\.//
获取剩余文件的扩展名。
LC_COLLATE=C sort
对结果进行排序,将符号保留在顶部。uniq -c
计算重复条目的次数。
答案2
使用 Python:
import os
from collections import Counter
from pprint import pprint
lst = []
for file in os.listdir('./'):
name, ext = os.path.splitext(file)
lst.append(ext)
pprint(Counter(lst))
输出:
Counter({'': 7,
'.png': 4,
'.mp3': 3,
'.jpg': 3,
'.mkv': 3,
'.py': 1,
'.swp': 1,
'.sh': 1})
答案3
如果你有 GNU awk,你可以这样做
printf '%s\0' * | gawk 'BEGIN{RS="\0"; FS="."; OFS="\t"}
{a[(NF>1 ? $NF : "(none)")]++}
END{for(i in a) print a[i],i}
'
即,构造/增加一个以最后.
分隔的字段为键的关联数组,或者一些任意的固定字符串(例如,(none)
如果没有扩展名)。
mawk
似乎不允许使用空字节记录分隔符 -mawk
如果您确信不需要处理文件名中的换行符,则可以使用默认换行符分隔符:
printf '%s\n' * | mawk 'BEGIN{FS="."; OFS="\t"} {a[(NF>1 ? $NF : "(none)")]++} END{for(i in a) print a[i],i}'
答案4
使用电源外壳如果这是一个选项:
Get-ChildItem -File | Group-Object Extension -NoElement
或者更短,使用别名:
ls -file | group -n Extension