我这两个 Bash 计算目录中平均文件大小的管道方法有什么问题?

What's wrong with my these two Bash pipeline methods for counting average file size in a directory?

问题:我正在尝试使用单行代码计算我所在目录(忽略子目录)的平均文件大小。我有两个方法:

ls -l | gawk '{sum += ; n++;} END {print sum/n;}'

var1=$(du -Ss| awk '{print }') ; var2=$(ls -l | wc -l) ; echo $var1/$var2 | bc

它们似乎产生相似的数字,尽管单位不同(第一个以 kB 为单位,第二个以 MB 为单位)。

然而,数字本身略有错误。这是怎么回事?哪个更合适?

duls 报告不同。考虑 du 手册页的这一部分:

   --apparent-size
          print apparent sizes,  rather  than  disk  usage;  although  the
          apparent  size is usually smaller, it may be larger due to holes
          in ('sparse') files, internal  fragmentation,  indirect  blocks,
          and the like

这让我们了解了 ls 显示的内容(表观大小)和 du 显示的内容(默认情况下,实际磁盘使用情况)之间的可能差异。

$ truncate -s 10737418240 sparse
$ ls -l sparse
-rw-rw-r-- 1 ec2-user ec2-user 10737418240 Feb 20 00:19 sparse
$ du sparse
0       sparse
$ ls -ls sparse
0 -rw-rw-r-- 1 ec2-user ec2-user 10737418240 Feb 20 00:19 sparse

以上显示了稀疏文件的报告差异。

此外,使用 ls -l 的文件计数将包括子目录、符号链接等。您可以改为使用 find 来仅显示文件:

find . -maxdepth 1 -type f