为什么`find -size -1G` 找不到任何文件?

jos*_*uis 7 find

当我发出:

find / \( -type f -size +10M \) -and \( -type f -size -1G \)
Run Code Online (Sandbox Code Playgroud)

我没有收到任何结果;但是,当我输入:

find / \( -type f -size +10M \) -and \( -type f -size -1000M \)
Run Code Online (Sandbox Code Playgroud)

它返回几个文件。

怎么了?我不能在操作员的两侧使用不同的测量单位-and吗?

Gil*_*il' 13

问题与-and运算符无关,而与 的参数的不直观语法有关-size。参数不是用单位给出的最大尺寸,而是最大数量和执行计算的单位。测试的-size -1k意思不是“小于1kB”而是“kB的数量(向上取整)小于(且不等于)1”。因此,-size -1k只匹配大小为0的文件,同样的-size -1M-size -1G等等。

要匹配 2 30字节或更少的文件,请使用-size -2G、 或-size -1025M等(注意 how-2G不等价于-2048M)。或者,使用! -size +1G- 带有+修饰符的大小表示“严格超过此大小”。要匹配 2 30 -1 字节或更少的文件,请使用-size -1073741824c.

我认为如此奇怪的原因是与, 计数块的历史兼容性;向上舍入是有道理的,因为占用例如 7.5 个块的文件实际上占用了 8 个块,而最后一个块没有被填满。因此意味着“占用 7 个块或更少”。添加一个单元就像使该单元成为块大小,因此意味着“占用 7kB 或更少”。-size -NUMBERUNIT-size -NUMBER-size -8-size -8k

(这个答案是关于 GNU find 的——其他一些实现的行为有所不同,POSIX 不标准化块和字节以外的单位。)