使用 AWK 统计不同文件格式的文件大小总和

需求说明

当前有一需求就是统计 Linux 系统上 NFS 挂载的存储中的几个目录下,不同文件格式的文件大小总和,例如 mp4 格式的所有文件多大,py 格式的所有文件一共多大等等。其中文件内容不为空而且文件名字中没有扩展名的忽略,使用 awk 命令进行统计。

命令统计

以下是使用 /var 目录进行验证测试。

只统计 /var 目录下所有文件,文件大小不为 0 且文件名不含有以 . 结尾的扩展名。

# find /var -type f -print0 | xargs -0 ls -l | awk -F'[ |/]+' '$5 !~ 0 && $NF ~ /.*\..*/{n=split($NF,name_array,".");array[name_array[n]]+=$5} END{for (i in array) print i,array[i]}' | sort -k2 -nr
cvd 117892267
png 9530725
1 8388714
log 8190699
bz2 8104116
db 6305237
html 5574547
sqlite 5442560
js 4012933
qm 3732428
ibd 1392640
003 1318912
css 1162399
2 871418
xz 465988
001 311296
old 232542
gif 199984
xml 147882
frm 142626
4 97689
pit 73112
asr 54348
MYI 45056
tdb 28672
jnl 26624
00000001 16384
log-20190802 14837
MYD 13678
bin 5855
pub 1328
status 969
conf 939
yaml 645
compiled 644
0_openjdk 522
0 496
pa 354
rv3 352
state 193
bash_profile 191
updated 163
lic 137
dat 128
bashrc 124
opt 122
14-64 86
O 84
cache 84
CSM 70
pid 38
lock 33
bash_logout 24
weekly 9
monthly 9
daily 9
tmp 6
SEQ 6

如果文件名字没有扩展名的也需要统计,也就是统计目录下所有不为空的文件,则可以将上面这条命令中 awk 的一个匹配项&& $NF ~ /.*\..*/"删除,命令执行结果如下:

# find /var -type f -print0 | xargs -0 ls -l | awk -F'[ |/]+' '$5 !~ 0{n=split($NF,name_array,"."); array[name_array[n]]+=$5} END{for (i in array) print i,array[i]}' | sort -k2 -nr 
cvd 117892267
ibdata1 79691776
messages 15858198
contents 11957108
png 9530725
Basenames 8851456
1 8388714
bz2 8104116
db 6305237
html 5574547
sqlite 5442560
log 4211937
js 4012933
qm 3732428
Providename 2895872
config-repos 2157249
ksycoca4 1691952
ibd 1392640
003 1318912
css 1162399
2 871418
xz 465988
sa01 457684
saved_tx 406465
config-main 364847
sar31 359885
sar05 356728
sar04 356728
sar03 356728
sar02 356728
sar01 355586
sa06 352168
001 311296
cron-20190804 285169
old 232542
gif 199984
cron 168457
pkgtups-checksums 167292
Sha1header 151552
xml 147882
frm 142626
vnetlib 127351
4 97689
checksum_data 92480
file-requires 74214
pit 73112
dmesg 67633
database 58947
asr 54348
var_uuid 52020
MYI 45056
command_line 40997
Group 32768
secure-20190804 29953
tdb 28672
jnl 26624
wtmp 25344
00000001 16384
log-20190802 14837
MYD 13678
obsoletes 11849
from_repo 10811
installed 8774
checksum_type 8670
Triggername 8192
var_contentdir 7050
maillog-20190804 6987
maillog 6693
var_infra 5875
bin 5855
Makefile 5345
reason 4728
java 4411
paths 4102
0 2741
releasever 1445
pub 1328
grubby 1324
45619_favicon 1315
43998_favicon 1247
group_member 1236
btmp-20190801 1152
btmp 1152
status 969
conf 939
print 856
mta 689
yaml 645
compiled 644
0_openjdk 522
88d4913391544a21a9f26bd1634c12e7-0 465
error_log-20190804 452
37522_favicon 446
10037_favicon 446
jre_openjdk 424
timedhosts 421
pa 354
rv3 352
mkisofs 283
cookie 256
state 197
grubby_prune_debug 193
installed_by 191
bash_profile 191
xinputrc 181
88d4913391544a21a9f26bd1634c12e7-unix-0 169
updated 163
lic 137
dat 128
bashrc 124
opt 122
cifs-idmap-plugin 114
14-64 86
O 84
cache 84
akonadiserverrc 81
CSM 70
google-chrome 63
cups_backend_smb 63
timestamps 61
ld 57
aria_log_control 52
wineserver 51
88d4913391544a21a9f26bd1634c12e7-default-source 51
version 46
88d4913391544a21a9f26bd1634c12e7-default-sink 43
drift 42
pid 38
uuid 36
machine-id 33
lock 33
bash_logout 24
weekly 9
monthly 9
daily 9
tmp 6
SEQ 6
dkms_dbversion 6
changed_by 1

命令解析

首先使用 find 结合 xargs 和 ls 命令打印目录下所有的文件详细信息。打印的文件信息中第五列为文件的大小,单位为字节 B。

# find /var -type f -print0 | xargs -0 ls -l 
-rw-r--r--. 1 root      root    101 Dec  5  2015 /var/opt/ab/Adlm/R12/zh/Webdepot/RTVersion.js
-rw-r--r--. 1 root      root    194 Dec  5  2015 /var/opt/ab/Adlm/R12/zh/Webdepot/style.css
-rw-r--r--. 1 root      root   1250 Dec  5  2015 /var/opt/ab/Adlm/R12/zh/Webdepot/Transparent.png
-rw-------. 1 root      root      9 Aug  6 03:35 /var/spool/anacron/cron.daily
-rw-------. 1 root      root      9 Jul 30 20:48 /var/spool/anacron/cron.monthly
-rw-------. 1 root      root      9 Aug  6 03:55 /var/spool/anacron/cron.weekly

find /var -type f -print0 | xargs -0 ls -l输出的结果然后传给 awk 处理,awk 进行匹配,并使用 awk 内置函数 split 对文件名字进行分割,以文件扩展名(例如 txt )作为下标,累加相同文件格式的总大小,最后打印结果并使用 sort 命令按数值大小降序排列。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注