查找命令:-size 行为

查找命令:-size 行为

我有一个关于findLinux 中命令的问题。

在我在网上找到的所有文章中-size -10M,都提到 attribute 会返回大小小于 10 MB 的文件。但当我尝试对此进行测试时,似乎-size -10M返回的文件大小小于或等于 9 MB。

如果我做

find . -type f -size -1M

find命令仅返回空文件(单位无关,可以是-1G,-1k...)。

find . -type f -size -2M

返回大小 <= 1M 的文件等。

手册页说:

请记住,尺寸会四舍五入到下一个单位。因此 -size -1M 不等于 -size -1048576c。前者只匹配空文件,后者匹配0到1,048,575字节的文件。

好吧,所以我猜 -1M 舍入为 0M,-2M 舍入为 -1M 等等...?

但是之后

find . -type f -size 1M

返回文件 <= 1M(即 100K 和 512K 文件,但不是空文件),而我希望它返回大小恰好为 1M 的文件。

find . -type f -size 2M

返回文件 > 1M 和 <= 2M 等。

这是正常的还是我做错了什么以及参数的确切行为是什么-size

答案1

GNU find 手册页内容如下 - 这似乎是 GNU find 特有的,其他实现可能有所不同,请参见下文:

像往常一样,+ 和 - 前缀表示大于和小于;即,n 个单位的精确大小不匹配。请记住,尺寸会四舍五入到下一个单位。因此-size -1M不等于-size -1048576c.前者只匹配空文件,后者匹配0到1,048,575字节的文件。

问题:

好吧,所以我猜 -1M 舍入为 0M,-2M 舍入为 -1M 等等...?

-size不。四舍五入的条件不是限制,而是文件大小本身。

取一个 1234 字节的文件和一个-size -1M指令。文件大小向上舍入到指令中提到的最接近的单位,此处为 MB。 1234 B -> 1 MB。这不符合条件,因为-size -1M要求少于1 MB(四舍五入后)。因此,事实上,对于任何仅返回空文件。-size -1xx

同样,-size 1M将匹配上面的文件,因为四舍五入后,它的大小正好是 1 MB。 (它将匹配大小为 1 B 到 1048576 B 的任何文件。)另一方面,-size 1k不会匹配,因为 1234 B 舍入为 2 kB。

请注意,条件中数字前面的-+与舍入行为无关。

始终以字节为单位指定大小可能很有用,因为这样就不会出现四舍五入的问题。-size -$((1024*1024))c将可靠地找到大小严格小于 1 MB(或 1 MiB,如果你愿意的话)的文件。如果您想要一个范围,例如,您可以使用( -size +$((512*1024-1))c -size -$((1024*1024+1))c )[512 kB, 1024 kB] 内的文件。

关于此的另一个问题:为什么“find -size -1G”找不到任何文件?


吉尔斯在那个相关问题中提到事实是POSIX 仅指定 -size Nas 表示以 512 字节块为单位的大小(如上舍入:“以字节为单位的文件大小,除以 512 并向上舍入到下一个整数”),以及as 表示以字节为单位的大小。两者都带有可选的加号或减号。其他未指定,并且并非所有实现都识别其他前缀,或者像 GNU find 那样进行舍入。-size Ncfind

我在 Mac 上使用 Busybox 和 *BSD find 进行了测试,似乎它们以一种感觉更明智的方式处理带有大小说明符的条件,即-size -1k匹配从 0 到 1023 字节的文件,与 相同-size -1024c,对于-size -1M==也类似-size -1024k(Busybox只有c,bk)。话又说回来,即使对于块中指定的大小,Busybox 似乎也没有进行舍入,这与 POSIX 文本似乎所说的相反。

所以,YMMV 再说一遍,也许最好坚持以字节为单位的大小。


-atime请注意, ,-mtime和条件也存在类似的问题-ctime

-atime n
文件上次访问时间为 n*24 小时前。当 find 计算出上次访问文件是在多少个 24 小时周期之前,任何小数部分都会被忽略,因此为了匹配-atime +1,文件必须至少被访问过几天前。

同样,仅使用-amin +$((24*60-1))它来查找至少在 24 小时前上次访问过的文件可能会更容易。 (最多四舍五入到一分钟,您无法摆脱它。)

也可以看看:为什么 find -mtime +1 只返回 2 天之前的文件?


这是正常的还是我做错了什么? -size 参数的确切行为是什么?

就 GNU find 的行为而言,这是“正常的”,但我不会称其为完全明智的。你感到困惑并没有错,只是find这才令人困惑。

答案2

find手册部分的答案-size

像往常一样,+ 和 - 前缀表示大于和小于;即,n 个单位的精确大小不匹配。请记住,大小向上舍入到下一个单位因此-大小-1M不等同于 -size -1048576c。前者只匹配空文件,后者匹配从 0 到 1,048,575 字节的文件。

因此,在所提到的每种情况下,都存在一个问题在与大小参数进行比较之前,将大小四舍五入到最接近的单位。如果-size使用“M”作为单位,则所有内容都会四舍五入为兆字节。

相关内容