如何找到支持大文件的?

如何找到支持大文件的?

我想找到我的系统的所有文件,其大小超过几千兆位。我以为我会使用find -size,但手册页指出:

大小不计算间接块

如果我理解正确的话,搜索仅在大小低于 时才相关 (number of direct blocks)×(size of a block) = 10*4096 = 40MiB。那么如何列出大于该值的文件呢?

编辑:我一定是在某个地方错了,因为手册页支持千兆位作为尺寸单位。任何人都可以看到我哪里错了?更改了标题以反映这一点。

答案1

我认为这个链接可能会澄清事情,Open Group 基本规范第 7 期,IEEE Std 1003.1,2013 年版。以下是 find 规范的部分摘录:

摘录自查找规范

-size 操作数指的是文件的大小,而不是它在文件系统中可能占用的块数。其目的是应使用 POSIX.1-2008 系统接口卷中定义的 st_size 字段,而不是历史实现中发现的 st_blocks。至少有两个原因:

在 System V 和 BSD 中,find 仅在 POSIX.1-2008 本卷指定的操作数的大小计算中使用 st_size。 (BSD 仅在处理 -ls 主节点时使用 st_blocks。)

用户通常以字节为单位来考虑文件大小,这也是 ls 实用程序用于 -l 选项输出的单位。 (在 System V 和 BSD 中,ls 使用 st_size 作为 -l 选项大小字段,并使用 st_blocks 进行 ls -s 计算。POSIX.1-2008 的本卷未指定 ls -s。)

如果我正确理解本节,第一节说明了所有内容“-size 操作数指的是文件的大小”。因此,大小是评估 st_size 而不是 st_blocks 时报告的。

例子

所以你应该能够使用如下命令:

# find files over 1G in size
$ find / -type f -size +1G

# find files smaller than 1G in size
$ find / -type f -not -size +1G

参考

答案2

这句话具有严重的误导性。如果您不想了解血淋淋的细节,请忘记您已阅读它并假设-size查看文件的大小。

文件的大小是您可以从中读取的字节数。大小为 N 的文件是一个 N 字节的数组。

c当您将字节 ( )以外的单位传递给 时-size,该find命令会将文件大小四舍五入到该单位的倍数。例如,-size 11k匹配10,240到11,263字节的文件;-size 12345M将文件大小从 12,943,622,145 映射到 12,944,670,720 字节。由于历史原因,默认单位称为块,其值为 512 字节。

这是最简单的部分。现在,在典型的文件系统上,文件的数据存储在块中。对于块大小为 512 字节的文件系统,一个 5123 字节的文件将占用 11 个数据块(最后一个仅部分使用)。因此find -size 11通常匹配由 11 个块组成的文件。

事实上,可能存在并发症。操作系统需要有一个地方来存储组成文件的所有块的位置。如果块太多,则需要再分配一些块来包含其他块的地址。此类块称为间接块。手册find告诉您,这些块没有被考虑在内——这并不奇怪,因为find它不计算块,而是考虑文件大小。

相反,由于压缩,文件使用的块可能比您预期的大小要少。经典的 unix 文件系统仅实现一种粗略的压缩形式:仅由空字节组成的块可能会被省略。这称为稀疏文件。

程序可以知道一个文件已经分配了多少块;这是st_blocks领域stat结构,相对于st_size。 GNU find 仅在-ls和的显示代码中使用它-printf,从不用于任何谓词。该st_blocks值粗略地指示文件在磁盘上占用的空间大小,如果文件稀疏,则该值可能小于文件大小,但它不考虑间接块。

1 Ext2、ext3 和 ext4 具有 1kB、2kB 或 4kB 的块。

相关内容