我想找到我的系统的所有文件,其大小超过几千兆位。我以为我会使用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 的块。