如何在Linux中获取文件或者目录的大小
当我们使用Linuxdu
命令时,我们会同时获得磁盘的实际使用情况以及文件或者目录的真实大小。我们将解释为什么这些值不相同。
实际磁盘使用量和实际大小
文件的大小及其在硬盘驱动器上占用的空间很少相同。磁盘空间按块分配。如果文件小于一个块,则仍将为整个块分配文件,因为文件系统没有较小的可用空间。
除非文件大小恰好是块的整数倍,否则文件在硬盘驱动器上使用的空间必须始终四舍五入到下一个整个块。例如,如果一个文件大于两个块但小于三个,则它仍需要三个空间来存储它。
关于文件大小,使用了两个度量。第一个是文件的实际大小,它是组成文件的内容的字节数。第二个是硬盘上文件的有效大小。这是存储该文件所需的文件系统块数。
一个例子
让我们看一个简单的例子。我们将单个字符重定向到文件中以创建一个小文件:
echo "1" > data.txt
现在,我们将使用长格式列表ls
来查看文件长度:
ls -l data.txt
长度是`dave dave'条目后面的数值,为两个字节。当我们仅向文件发送一个字符时,为什么要两个字节?让我们看看文件内部发生了什么。
我们将使用" hexdump"命令,该命令将为我们提供确切的字节数,并允许我们将非打印字符视为十六进制值。我们还将使用-C(规范)选项来强制输出在输出的主体中显示十六进制值及其等效的字母数字字符:
hexdump -C data.txt
输出显示,从文件的偏移量00000000开始,有一个字节包含十六进制值31,而一个字节包含十六进制值0A。输出的右侧部分尽可能地将这些值描述为字母数字字符。
十六进制值31用于表示数字1. 十六进制值0A用于表示换行字符,该字符不能显示为字母数字字符,因此将其显示为句点(。)。换行符由echo
添加。默认情况下,echo
在显示需要写入终端窗口的文本后开始新行。
与ls
的输出相符,并且与两个字节的文件长度一致。
现在,我们将使用du
命令查看文件大小:
du data.txt
它说大小是四个,但是四个呢?
有块,然后有块
当du
以块为单位报告文件大小时,它使用的大小取决于几个因素。我们可以在命令行上指定应使用的块大小。如果我们不强制du使用特定的块大小,则它会遵循一组规则来决定使用哪个块。
首先,它检查以下环境变量:
DU_BLOCK_SIZE
BLOCK_SIZE
BLOCKSIZE
如果存在任何这些,则设置块大小,并且du
停止检查。如果未设置,则" du"默认为1,024字节的块大小。除非是,否则将设置一个名为" POSIXLY_CORRECT"的环境变量。如果是这样,du
的默认块大小为512字节。
那么,我们如何找出正在使用的是哪一个呢?我们可以检查每个环境变量来解决它,但是有一种更快的方法。让我们将结果与文件系统使用的块大小进行比较。
为了发现文件系统使用的块大小,我们将使用" tune2fs"程序。然后,我们将使用-l(列表超级块)选项,通过grep输出输出,然后打印包含单词Block的行。
在此示例中,我们将查看第一个硬盘驱动器的第一个分区" sda1"上的文件系统,并且需要使用" sudo":
sudo tune2fs -l /dev/sda1 | grep Block
文件系统块大小为4,096字节。如果将其除以从du(4)得到的结果,则表明du默认块大小为1,024字节。我们现在知道一些重要的事情。
首先,我们知道可用于存储文件的最小文件系统空间为4,096字节。这意味着即使我们很小的两字节文件也要占用4 KB的硬盘空间。
要记住的第二件事是专用于报告硬盘驱动器和文件系统统计信息的应用程序,例如du,ls和tune2fs,可能对块的含义有不同的理解。 " tune2fs"应用程序报告了真实的文件系统块大小,而" ls"和" du"可以配置或者强制使用其他块大小。这些块大小不旨在与文件系统块大小相关;它们只是这些命令在其输出中使用的块。
最后,除了使用不同的块大小之外,来自du和tune2fs的答案传达了相同的含义。 " tune2fs"结果是一个4,096字节的块,而" du"结果是1,024字节的四个块。
使用du
没有命令行参数或者选项,du
列出当前目录和所有子目录正在使用的总磁盘空间。
让我们看一个例子:
du
该大小以默认块大小(每个块1,024字节)报告。遍历整个子目录树。
在其他目录上使用du
如果我们想让du报告与当前目录不同的目录,则可以在命令行中将路径传递至该目录:
du ~/.cach/evolution/
在特定文件上使用du
如果我们想让du报告特定文件,请在命令行中将路径传递到该文件。我们也可以将shell模式传递给一组文件,例如* .txt
:
du ~/.bash_aliases
报告目录中的文件
要使" du"报告当前目录和子目录中的文件,请使用" -a"(所有文件)选项:
du -a
对于每个目录,报告每个文件的大小,以及每个目录的总计。
限制目录树深度
我们可以告诉du
将目录树列出到一定深度。为此,请使用-d(最大深度)选项并提供深度值作为参数。请注意,所有子目录均已扫描并用于计算报告的总数,但并未全部列出。要将最大目录深度设置为一级,请使用以下命令:
du -d 1
输出列出了当前目录中该子目录的总大小,并且还提供了每个子目录的总大小。
要列出更深一层的目录,请使用以下命令:
du -d 2
设置块大小
我们可以使用" block"选项为当前操作的" du"设置块大小。要使用一个字节的块大小,请使用以下命令来获取目录和文件的确切大小:
du --block=1
如果要使用1兆字节的块大小,则可以使用-m
(兆字节)选项,它与--block = 1M
相同:
du -m
如果要根据目录和文件使用的磁盘空间以最合适的块大小报告大小,请使用-h(人类可读)选项:
du -h
要查看文件的外观大小,而不是用于存储文件的硬盘空间,请使用--apparent-size选项:
du --apparent-size
我们可以将其与-a
(all)选项结合使用以查看每个文件的外观大小:
du --apparent-size -a
列出每个文件及其外观大小。
仅显示总计
如果我们想让du只报告目录的总数,请使用-s(摘要)选项。我们还可以将其与其他选项结合使用,例如-h(人类可读)选项:
du -h -s
在这里,我们将它与--apparent-size
方法一起使用:
du --apparent-size -s
显示修改时间
要查看创建或者上次修改的时间和日期,请使用--time选项:
du --time -d 2
结果奇怪吗?
如果我们从du中看到奇怪的结果,尤其是当我们将大小与其他命令的输出交叉引用时,通常是由于可以设置不同命令的块大小或者默认命令的块大小不同。也可能是由于实际文件大小和存储它们所需的磁盘空间之间的差异。
如果需要匹配其他命令的输出,请尝试使用du中的--block选项。