如何使用 gnu+linux 终端获取硬盘上所有文件扩展名的计数?

如何使用 gnu+linux 终端获取硬盘上所有文件扩展名的计数?

在 Windows 上,我有一个程序可以计算硬盘驱动器上的所有文件,输出显示文件扩展名列表和数字(显示驱动器上有多少文件,例如 jpg)。

如何在 gnu+linux 的终端中执行此操作?

答案1

find /filesystem -xdev -type f -name '?*.*' -print0 | awk -F. -vRS='\0' '
   {c[$NF]++}; END{for (i in c) print c[i],i}' | sort -rn | less

/filesytem您要查看的文件系统的挂载点在哪里。

答案2

Unix 的理念是提供构建块,并让您组装这些构建块来执行专门的任务,例如本任务。

find命令遍历目录树并列出符合特定条件的文件或对它们进行操作。例如,find -xdev /遍历根文件系统上的所有文件并显示它们的名称。该选项-xdev忽略其他文件系统上的文件,例如网络挂载、提供系统信息的特殊文件系统等。

要选择打印内容,GNU 查找提供-printf行动。这%f指示打印不带目录部分的文件名。

Linux 文件名可以包含除斜杠(目录分隔符)和空字节之外的任何字节。如果您愿意假设您的文件名不包含换行符,则文件名的处理会更简单。为了安全起见,您可以排除包含换行符的文件名。

find / -xdev ! -name $'*\n*' -printf '%f\n'

要选择具有扩展名的文件,我们将匹配包含不是第一个字符的点的名称,并且仅匹配常规文件(您可能也想或不想包含符号链接)。

find / -xdev -name '?*.*' ! -name $'*\n*' -type f -printf '%f\n'

够了find。为了处理扩展,我们将使用文本处理工具,使用 shell管道将它们结合起来。第一的sed进行一些重写以消除文件名中非扩展名的部分:

find / -xdev -name '?*.*' ! -name $'*\n*' -type f -printf '%f\n' |
  sed 's/.*\.//'

最后,为了计算每个扩展出现的次数,我们种类输出和计算重复项,最后按出现次数对结果进行排序。

find / -xdev -name '?*.*' ! -name $'*\n*' -type f -printf '%f\n' |
  sed 's/.*\.//' | sort | uniq -c | sort -n

相关内容