我这两个 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 为单位)。
然而,数字本身略有错误。这是怎么回事?哪个更合适?
du
和 ls
报告不同。考虑 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
问题:我正在尝试使用单行代码计算我所在目录(忽略子目录)的平均文件大小。我有两个方法:
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 为单位)。
然而,数字本身略有错误。这是怎么回事?哪个更合适?
du
和 ls
报告不同。考虑 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