我对find
Linux 中的命令有疑问。
在我在网上找到的所有文章中,它都说 属性-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 -1x
x
同样,-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 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
是混淆。
归档时间: |
|
查看次数: |
539 次 |
最近记录: |