总结目录的总文件大小有很大的不同:Ruby-e,du-ach,ls-al"total"
ls | ruby -ne 'BEGIN{a= []}; a << File.size($_.chomp).to_i; END{puts a.sum}'
上面的代码获取每个文件的文件大小,将其放入一个数组中,并打印总和。
返回的值与:
du -ach
并且这两个值与通过以下方式显示的总计非常不同:
ls -al
没有隐藏文件。
苹果系统
回答
如果du向您展示了大量 4K 和 8K 文件,这是因为它向您展示了块大小。为了性能,磁盘上的存储由块组成。如今,典型的块是 4K。即使是单个字节也会占用一个完整的块。
$ echo '1' > this
$ hexdump this
0000000 31 0a
0000002
$ ls -l this
-rw-r--r-- 1 schwern staff 2 Dec 5 15:16 this
$ du -h this
4.0K this
$ du --apparent-size -h this
2 this
$ ruby -e 'puts File.size(ARGV[0])' this
2
有问题的文件有 2 个字节的内容。ls -l和File.size报告两个字节的内容。
du,默认情况下,报告文件的块大小。这是因为它是一个磁盘使用情况工具,您想知道实际占用的磁盘数量。这 2 个字节占用了 4K 的磁盘空间。1000 个 2 字节文件将占用 4000K,而不是 2000 字节。
出于这个原因,许多程序会避免有很多小文件,而是通过将它们打包成一个图像文件来节省磁盘空间。一个简单的例子是Git packfiles。
THE END
二维码