如何在Linux中获取文件的物理大小?


12

我可以ls -l用来获取文件的逻辑大小,但是有没有办法获取文件的物理大小?


请定义“实际”尺寸的含义。
约尔格W¯¯米塔格

Answers:


28

ls -l将为您提供文件的外观大小,即程序从头到尾读取文件时将读取的字节数。 du将为您提供“磁盘上”文件的大小。

默认情况下,du以磁盘块数为您提供文件的大小,但是您可以使用它-h来获取人类可读的单位。另请参见du系统上的手册。

请注意,使用GNU coreutil du(可能是Linux上的版本), -b获取字节表示该--apparent-size选项。这不是您要用来获取磁盘上实际使用的字节数的方式。而是使用--block-size=1-B 1

使用GNU ls,您也可以ls -s --block-size=1对文件进行处理。这将提供与du -B 1文件相同的编号。


例:

$ ls -l file
-rw-r--r--  1 myself wheel  536870912 Apr  8 11:44 file

$ ls -lh file
-rw-r--r--  1 myself wheel   512M Apr  8 11:44 file

$ du -h file
24K    file

$ du -B 1 file
24576   file

$ ls -s --block-size=1 file
24576 file

这意味着这是一个512 MB的文件,大约需要24 KB的磁盘空间。它是一个稀疏文件(大多数零实际上并未写入磁盘,但在文件中表示为逻辑“空洞”)。当使用预分配的大文件(例如虚拟机的磁盘映像或交换文件等)时,稀疏文件是常见的。创建稀疏文件很快,而用零填充则很慢(并且是不必要的)。

另请参见fallocateLinux系统上的手册。


在哪种情况下,这种差异很重要?你可以举一个实际的例子吗?先感谢您。
D'Arcy Nader

1
@ D'ArcyNader查看最新答案。
Kusalananda

如果我误解了,请纠正我,但是第一句话似乎是相反的:stackoverflow.com/a/31437673/3701431 du将显示实际可以读取多少数据,同时ls显示分配磁盘扇区的程度。
Sergiy Kolodyazhnyy

2
@SergiyKolodyazhnyy(对不起,请稍后答复)不,du显示文件实际使用的磁盘数量,而显示的视在大小(逻辑大小)ls是程序可以从中读取多少字节。如果文件稀疏,则某些读取字节将为零,但它们仍将传递给读取它们的程序(不是从磁盘读取)。
库萨兰达

这是一个很好的答案。
Lizardx

3

我得到这样的文件大小以字节为单位:

actualsize=$(du -b "${file}" | cut -f 1)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.