在 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