创建usb驱动器内容的可视化报告

・3 分钟阅读

 $ find /path/to/drive -type f -exec file -b '{}' ; -printf '%sn' | awk -F , 'NR%2 {i=$1} NR%2==0 {a[i]+=$1} END {for (i in a) printf("%12u %sn",a[i],i)}' | sort -nr

说明

我有一堆u盘,我想快速汇总驱动器上的内容。pdf,图像,文本或可执行文件占用了多少空间。这可以作为文本摘要或饼图输出。

这个one-liner产生一个类似这样的列表:


 5804731229 FLAC audio bitstream data
 687302212 MPEG sequence
 99487460 data
 60734903 PDF document
 55905813 Zip archive data
 38430192 ASCII text
 32892213 gzip compressed data
 24847604 PNG image data
 16618355 XML 1.0 document text
 13876248 JPEG image data

find命令将定位到给定目录下的所有常规文件(-type f ),该目录可以是已挂载的U盘或其他目录,对于每个文件,它运行file -b命令,并使用文件名打印文件类型; 如果成功,它还将打印文件大小(-printf'%sn' ),这将在一行中产生一个包含文件类型的列表,后面是文件的大小。

awk脚本将此作为输入,GNU file命令通常会生成非常具体的描述,例如,GIF图像数据,版本87A,640 x480 -为了概括这些,我们将字段分隔符设置为带有-F选项的逗号,然后,引用$1只使用第一个逗号左边的内容,给我们一个比GIF图像数据更通用的描述。

awk脚本中,第一个模式动作对NR%2 {i=$1}应用于每个奇数行,将变量i设置为文件类型描述,连续编号的行由NR%2==0 {a[i]+=$1}处理,将行(文件大小是多少)的值添加到数组变量[i]中,这导致一个由文件类型索引的数组,每个数组成员保存该类型的累积字节总和。END { ... } 填充图案操作对最后打印出每个文件类型的总大小的格式列表。

在行的末尾,sort命令排序列表,将文件类型放在顶部最大的位置。

限制

file和find的-printf使用-b选项,这些工具由GNU实用程序支持。运行需要很长的时间,因为它需要打开,并且分析给定目录下的每个文件。

Hujiuxiang profile image