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

use*_*003 16 linux size files

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

Kus*_*nda 36

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

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

请注意,对于 GNU coreutil du(这可能是您在 Linux 上拥有的),使用-bto get bytes 意味着该--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
Run Code Online (Sandbox Code Playgroud)

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

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

  • @SergiyKolodyazhnyy(抱歉回复晚了)不,“du”显示文件实际使用的磁盘数量,而“ls”显示的表观大小(逻辑大小)是程序能够读取的字节数它。如果文件是稀疏的,一些读取的字节将为零,但它们仍然会被传递给读取它们的程序(而不是从磁盘)。 (2认同)

scr*_*rel 5

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

actualsize=$(du -b "${file}" | cut -f 1)
Run Code Online (Sandbox Code Playgroud)