输出将包括目录名称,文件名和文件大小。运行命令的每个目录都有一个(最大文件)。
如果可能的话,该目录中文件的平均大小也是如此。
目的是使目录能够查找比目录中其他文件大得多的文件,以便可以替换它们
合并find
并awk
允许计算平均值:
find . -type f -printf '%s %h/%f\0'|awk 'BEGIN { RS="\0" } { SIZE=$1; for (i = 1; i <= NF - 1; i++) $i = $(i + 1); NF = NF - 1; DIR=$0; gsub("/[^/]+$", "", DIR); FILE=substr($0, length(DIR) + 2); SUMSIZES[DIR] += SIZE; NBFILES[DIR]++; if (SIZE > MAXSIZE[DIR] || !BIGGESTFILE[DIR]) { MAXSIZE[DIR] = SIZE; BIGGESTFILE[DIR] = FILE } }; END { for (DIR in SUMSIZES) { printf "%s: average %f, biggest file %s %d\n", DIR, SUMSIZES[DIR] / NBFILES[DIR], BIGGESTFILE[DIR], MAXSIZE[DIR] } }'
以更易读的方式进行布局,AWK脚本是
BEGIN { RS="\0" }
{
SIZE=$1
for (i = 1; i <= NF - 1; i++) $i = $(i + 1)
NF = NF - 1
DIR=$0
gsub("/[^/]+$", "", DIR)
FILE=substr($0, length(DIR) + 2)
SUMSIZES[DIR] += SIZE
NBFILES[DIR]++
if (SIZE > MAXSIZE[DIR] || !BIGGESTFILE[DIR]) {
MAXSIZE[DIR] = SIZE
BIGGESTFILE[DIR] = FILE
}
}
END {
for (DIR in SUMSIZES) {
printf "%s: average %f, biggest file %s %d\n", DIR, SUMSIZES[DIR] / NBFILES[DIR], BIGGESTFILE[DIR], MAXSIZE[DIR]
}
}
这需要空分隔的输入记录(我从muru的答案中窃取了此记录);对于每个输入记录,
完成所有操作后,脚本将循环遍历各个键,SUMSIZES
并输出目录,平均大小,最大文件的名称和大小。
您可以将输出通过管道sort
传递到按目录名称排序。如果您要另外以人性化的格式设置尺寸,则可以将printf
行更改为
printf "%.2f %d %s: %s\n", SUMSIZES[DIR] / NBFILES[DIR], MAXSIZE[DIR], DIR, BIGGESTFILE[DIR]
然后将输出通过管道传递到numfmt --field=1,2 --to=iec
。您仍然可以按目录名称对结果进行排序,只需要从第三个字段开始排序即可sort -k3
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句