输出将包括目录名、文件名和文件大小。运行命令的每个目录对应一个(最大文件)。
如果可能的话,该目录中文件的平均大小也是如此。
目的是可以让目录查找比目录中其他文件大得多的文件,以便可以替换它们
mur*_*uru 11
与GNU find
,sort
和sed
(4.2.2或以上),排序一旦上的文件大小和再次对目录路径:
find /some/dir -type f -printf '%s %f%h\0' |
sort -zrn |
sort -zut/ -k2 |
sed -zre 's: ([^/]*)(/.*): \2/\1:'
Run Code Online (Sandbox Code Playgroud)
解释:
/
),每个条目以 ASCII NUL 字符终止。sort
第二个/
分隔字段中的所有内容仅打印第一个唯一条目,这将是包含文件的目录的路径。sed
交换目录和文件名,这样我们就得到了一个正常的路径。对于可读输出,用换行符替换 ASCII NUL:
find /some/dir -type f -printf '%s %f%h\0' |
sort -zrn |
sort -zut/ -k2 |
sed -zre 's: ([^/]*)(/.*): \2/\1:' |
tr '\0' '\n'
Run Code Online (Sandbox Code Playgroud)
示例输出:
$ find /var/log -type f -printf '%s %f%h\0' | sort -zrn | sort -zt/ -uk2 | sed -zre 's: ([^/]*)(/.*): \2/\1:' | tr '\0' '\n'
3090885 /var/log/syslog.1
39789 /var/log/apt/term.log
3968 /var/log/cups/access_log.1
31 /var/log/fsck/checkroot
467020 /var/log/installer/initial-status.gz
44636 /var/log/lightdm/seat0-greeter.log
15149 /var/log/lxd/lxd.log
4932 /var/log/snort/snort.log
3232 /var/log/unattended-upgrades/unattended-upgrades-dpkg.log
Run Code Online (Sandbox Code Playgroud)
结合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] } }'
Run Code Online (Sandbox Code Playgroud)
以更易读的方式布局,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]
}
}
Run Code Online (Sandbox Code Playgroud)
这需要空分隔的输入记录(我从穆鲁的回答中偷走了这个);对于每个输入记录,它
完成所有这些后,脚本会遍历输入的键SUMSIZES
并输出目录、平均大小、最大文件名和大小。
您可以将输出通过管道sort
传输到按目录名称排序。如果您想以人性化的形式另外格式化大小,您可以将printf
行更改为
printf "%.2f %d %s: %s\n", SUMSIZES[DIR] / NBFILES[DIR], MAXSIZE[DIR], DIR, BIGGESTFILE[DIR]
Run Code Online (Sandbox Code Playgroud)
然后将输出通过管道传输到numfmt --field=1,2 --to=iec
. 您仍然可以按目录名称对结果进行排序,您只需要从第三个字段开始排序:sort -k3
。