查找命令:-size 行为

gol*_*er3 10 size find

我对findLinux 中的命令有疑问。

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

如果我做

find . -type f -size -1M
Run Code Online (Sandbox Code Playgroud)

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

find . -type f -size -2M
Run Code Online (Sandbox Code Playgroud)

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

手册页说:

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

好的,所以我猜 -1M 被四舍五入到 0M,-2M 到 -1M 等等......?

但是之后

find . -type f -size 1M
Run Code Online (Sandbox Code Playgroud)

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

find . -type f -size 2M
Run Code Online (Sandbox Code Playgroud)

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

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

ilk*_*chu 17

GNU find 手册页说明如下——这似乎特定于 GNU find,其他实现可能有所不同,见下文:

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

题:

好的,所以我猜 -1M 被四舍五入到 0M,-2M 到 -1M 等等......?

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

取一个 1234 字节的文件和一个-size -1M指令。文件大小四舍五入到指令中提到的最接近的单位,这里是 MB。1234 -> 1 MB。这不符合条件,因为-size -1M需要少于1 MB(在此舍入之后)。因此,实际上,对于 any ,只返回空文件。-size -1xx

同样,-size 1M将匹配上面的文件,因为在四舍五入后,它的大小正好是 1 MB。另一方面,-size 1k不会,因为它舍入为 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 仅指定 为 512 字节块中的含义大小(四舍五入:“以字节为单位的文件大小,除以 512 并四舍五入为下一个整数”),并表示大小以字节为单位。两者都带有可选的加号或减号。其他的没有指定,并不是所有的实现都能识别其他前缀,或者像 GNU find 一样。-size N-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是混淆。