我有一个关于find
Linux 中命令的问题。
在我在网上找到的所有文章中-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 -1x
x
同样,-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 N
as 表示以 512 字节块为单位的大小(如上舍入:“以字节为单位的文件大小,除以 512 并向上舍入到下一个整数”),以及as 表示以字节为单位的大小。两者都带有可选的加号或减号。其他未指定,并且并非所有实现都识别其他前缀,或者像 GNU find 那样进行舍入。-size Nc
find
我在 Mac 上使用 Busybox 和 *BSD find 进行了测试,似乎它们以一种感觉更明智的方式处理带有大小说明符的条件,即-size -1k
匹配从 0 到 1023 字节的文件,与 相同-size -1024c
,对于-size -1M
==也类似-size -1024k
(Busybox只有c
,b
和k
)。话又说回来,即使对于块中指定的大小,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”作为单位,则所有内容都会四舍五入为兆字节。