从命令行获取包括二进制文件在内的独特文件扩展名的文件数量统计

从命令行获取包括二进制文件在内的独特文件扩展名的文件数量统计

我正在尝试递归计算不同扩展名的数量以及每个扩展名在目录的文件中出现的频率,并且我想包含没有扩展名的文件的数量。我正在尝试:

find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | 
  grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | 
   sort | uniq -c | sort -rn

但这不会显示没有扩展名的二进制文件。我该如何正确执行此操作?

更新:我的主要目的是找出在一个特定文件夹中下载了多少个文件及其 terraform / terraform 插件二进制文件的总大小,以便我可以查看和删除它们。

答案1

-name "*.*"find已经排除了任何没有扩展名的文件,因为您只寻找至少有一个扩展名的文件.,然后,您grep明确删除了没有扩展名的文件:

grep -o -E "\.[^\.]+$" 

这将打印扩展名,但如果文件没有扩展名,则不会打印任何内容:

$ echo 'foo.txt' | grep -o -E "\.[^\.]+$" 
.txt
$ echo 'foo' | grep -o -E "\.[^\.]+$" 
$

如果您想要计算每个扩展名或无扩展名的出现次数,请尝试以下操作:

find . -type f | 
    awk -F'.' '{
                 if(NF>2){ 
                    ext=tolower($NF)
                    k["."ext]++ } 
                 else{ k["no extension"]++ } 
               }
               END{ for(i in k){ print i":"k[i] } }'

例如,给定此目录:

$ touch file{1..3}.txt file.jpg file.JPG file."weird extension with spaces" file
$ ls
 file   file1.txt   file2.txt   file3.txt   file.jpg  file.JPG 
 'file.weird extension with spaces'

你得到:

$ find . -type f | 
>     awk -F'.' '{
>                  if(NF>2){ 
>                     ext=tolower($NF)
>                     k["."ext]++ } 
>                  else{ k["no extension"]++ } 
>                }
>                END{ for(i in k){ print i":"k[i] } }'
no extension:1
.txt:3
.weird extension with spaces:1
.jpg:2

请注意,这会将隐藏文件(例如名为 的文件.hidden)视为其自己的扩展名。这将计为扩展名 的一次命中.hidden。带有扩展名的隐藏文件将被正确计算(即.hidden.txt会增加扩展名的命中次数.txt),但没有扩展名的隐藏文件则不会。我不知道您想如何处理这个问题,因为扩展名在 Linux 中主要是装饰性的。

顺便说一句,文件是否为二进制与它是否具有扩展名无关。

相关内容