解释:

解释:

我想计算目录中每个扩展名的文件数量以及没有扩展名的文件数量。

我尝试了几种方法,但还没有找到可行的解决方案:

  • 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

相关内容