我正在寻找一种方便的单行代码来计算目录中的平均文件大小。
我想要的是:
所有文件的大小/目录中的文件数
答案1
使用 GNU 查找:
find . -type f -printf '%s\n' | awk '{s+=$0}
END {printf "Count: %u\nAverage size: %.2f\n", NR, s/NR}'
或者对于磁盘使用情况:
find . -type f -printf '%b\n' | awk '{s+=$0}
END {printf "Count: %u\nAverage size: %.2f\n", NR, s*512/NR}'
请注意,如果同一文件有多个硬链接,则会多次计算其磁盘使用情况。
上面仅计算常规文件,不计算符号链接或目录或其他特殊文件。它包括隐藏文件。
与内置函数相同zsh
:
zmodload -i zsh/stat
count() {zstat -Hs -- $REPLY; ((size+=$s[size], count++, 0))}
size=0 count=0
**/*(oNDN.+count)
print -f "Count: %s\nAverage size: %.2f\n" $count $(($size./count))
答案2
对于 FreeBSD / Mac OS X find
,stat
并且awk
(虽然不完全是方便的一句台词):
find -x . -type f -maxdepth 1 -exec sh -c 'stat -f '%z' "${@}"' _ '{}' + |
LC_ALL=C awk -v pwd="${PWD}" '
BEGIN{ sum=0; count=0; }
{ sum+=$1; ++count; }
END{
if (count == 0) exit;
printf ("number of files: %d\n", count);
printf ("average file size in B: %.5f\n", sum/count);
printf ("average file size in KB: %.5f\n", (sum/count) / 1024);
printf ("average file size in MB: %.5f\n", (sum/count) / (1024*1024));
printf ("directory: %s\n", pwd);
}
'
答案3
一行简单的解决方案:
ls -Rl -- "$DIR" | awk 'BEGIN{sum=0;count=0};/^-/{sum+=$5;++count};END{print sum/count}'
它有一个语法欺骗,只考虑ls
以“-”开头的输出行,这应该构成常规文件的数据。
答案4
仅适用于目录中的文件,忽略子目录:
expr $(du -Ss | cut -f1) / $(find /path/to/dir -maxdepth 1 -type f | wc -l)
或者计算所有文件,包括子目录中的文件:
expr $(du -s | cut -f1) / $(find /path/to/dir -type f | wc -l)