当我发出:
find / \( -type f -size +10M \) -and \( -type f -size -1G \)
我没有收到任何结果;但是,当我输入:
find / \( -type f -size +10M \) -and \( -type f -size -1000M \)
它返回一些文件。
怎么了?我不能在操作器的两侧使用不同的测量单位吗-and
?
答案1
问题与-and
运算符无关,而是与 参数的不直观语法有关-size
。参数不是给定单位的最大大小,而是执行计算的最大数字和单位。该测试-size -1k
并不是指“小于 1kB”,而是“kB 数(向上取整)小于(且不等于)1”。因此,-size -1k
仅匹配大小为 0 的文件,对于-size -1M
、-size -1G
等也同样。
要匹配 2 30字节或更少的文件,请使用-size -2G
、 或-size -1025M
等(观察如何-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 没有标准化块和字节以外的单位。)