Answers:
在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);
}
'
-v var=value
,awk
将扩大ANSI C序列\n
,\r
...虽然贝壳做外销PWD
,所以你可以用ENVIRON["PWD"]
在awk
不具备那样的问题具有在他们的名字反斜杠目录。
find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'
。
使用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 '%k\n' | awk '{s+=$0}
END {printf "Count: %u\nAverage size: %.2f\n", NR, s*1024/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))
一行简单的解决方案:
ls -Rl -- "$DIR" | awk 'BEGIN{sum=0;count=0};/^-/{sum+=$5;++count};END{print sum/count}'
它具有语法作弊功能,仅考虑ls
以“-”开头的输出行,该行应构成常规文件的数据。
仅用于目录中的文件,而忽略子目录:
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)
du -s
将累加所有文件和目录以及其他非常规文件的磁盘使用量(而不是大小),但不包括指向同一文件的额外硬链接,而将计算所有常规文件。此外,带有换行符的文件名将被计数多次。是GNU特定的。将报告扇区或千字节,具体取决于操作系统。find
du -S
du -s