如何打印扩展名分隔的文件夹(递归)中的文件数量?

时间:2017-04-24 15:22:08

标签: bash

例如,我有一个包含不同类型文件的文件夹(.jpg,.png,.txt,..),并且想知道我的文件夹中的每个扩展名分别有多少个文件。

输出将是这样的:

.jpg : 255
.png : 123
.txt : 12
No extension : 1

目前,我只知道如何使用此命令查找一个给定扩展名存在多少个文件:

find /folderpath -type f -name '*.jpg' | wc -l

但是我希望它能够自己找到文件扩展名。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您可以使用以下命令对单个目录执行此操作:

 ls | grep '\.' | sed 's/.*\././' | sort | uniq -c

(我忽略了没有.的文件 - 如果你想要别的话就调整一下)

我建议将其充实到一个脚本(例如,extension_counts)中,该脚本会获取目录列表,并且每个目录都会以您希望的格式输出报告所遵循的路径。

快速而肮脏的版本:

 #!/bin/sh
 for dir in $*; do
     echo $dir
     (cd $dir && ls | grep '\.' | sed 's/.*\././' | sort | uniq -c)
 done

......但你应该考虑强化这一点。

然后,对于递归部分,您可以使用findxargs

 find . -type d | xargs extension_counts

通过将extension_counts定义为函数,您可以更聪明地在一个脚本文件中完成所有操作,但这是一个优化。

解析ls(或find)的输出存在一些缺陷。在这种情况下,我能想到的唯一潜在问题是包含换行符的文件名(是的,这是可能的)。您可以接受使用非专为奇怪文件名设计的工具,或者您可以在具有更强大数据结构的语言中编写更强大的内容,例如Python,Perl,Ruby,Go等。

答案 1 :(得分:2)

这可以通过快速insert into Course(CourseID,CourseDes... 一个班轮来完成:

awk
  1. awk脚本会将每一行拆分一段时间find /folderpath -type f -name '*.*' | awk -F"." 'BEGIN{OFS=" : "}{extensions[$NF]++}END{for (ext in extensions) { print ext, extensions[ext]}};'
  2. 将OFS(输出字段分隔符)设置为" :" -F"."
  3. 使用密钥BEGIN{OFS=" : "}的文件扩展名加载数组,其中$ NF是记录中的最后一个字段。数组的值将是一个计数extensions[$NF]
  4. 处理完所有行后,我们迭代数组++并打印出索引和值for (ext in extensions)

答案 2 :(得分:2)

我会这样做:

  1. 列出文件名(而不是find生成的路径):

    find . -type f | rev | cut -d/ -f1 | rev

    我们反转每一行,以便我们可以轻松解决最后一个字段

  2. 缩小到他们的扩展名:

    sed -E 's/^.*\././;t end;s/.*/No extension/;:end'

    在这里我们删除第一个点的所有内容,或者如果无法完成替换(因为没有点),我们将所有内容替换为“No extension”。

  3. 对结果进行排序:

    sort

  4. 按分组分组并添加计数:

    uniq -c

  5. 如下所示的完整命令:

    find . -type f | rev | cut -d/ -f1 | rev | sed -E 's/^.*\././;t end;s/.*/No extension/;:end' | sort | uniq -c
    

    请注意,演示文稿与您的演示文稿不同,可以使用其他sed轻松修复:

          2 .119
          1 .147
          [...]
          1 .Xauthority
          1 .xml
          1 .xsession-errors
          2 .zip
          1 .zshrc
         48 No extension