“find . -size”命令的文件大小选项是什么?

“find . -size”命令的文件大小选项是什么?

我发现要查找文件大小(以字节为单位),我使用“c”。

所以我可以使用 find 来查找 1000 字节的文件大小。 -尺寸1000c

但是不同类型的大小(例如 Mb、Gb 甚至位)又如何呢?我需要使用什么字符或字母?

答案1

POSIX仅指定无后缀或指定c后缀。如果没有后缀,值将被解释为 512 字节块;带有c后缀的值将被解释为字节计数,正如您所确定的那样。

一些实现支持更多后缀;例如GNUfind支持

  • b对于 512 字节块
  • c对于字节
  • w对于 2 字节字
  • k千字节
  • M兆字节
  • G吉字节

答案2

POSIXly:

find . -size  1000c # files whose size¹ is exactly 1000 bytes (not characters)
find . -size -1000c # strictly less than 1000 bytes (0 - 999)
find . -size +1000c # strictly more than 1000 bytes (1001 - ∞)

然后,使用 POSIXsh语法,您可以执行以下操作:

EiB=$((1024*(PiB=1024*(TiB=1024*(GiB=1024*(MiB=1024*(KiB=1024)))))))
 EB=$((1000*( PB=1000*( TB=1000*( GB=1000*( MB=1000*( kB=1000)))))))

find . -size "$(( 12 * GiB ))c" # exactly 12GiB (12,884,901,888 bytes)
find . -size "$(( 12 * GB  ))c" # exactly 12GB (12,000,000,000 bytes)
find . -size "-$(( 12 * GB ))c" # 0 - 11,999,9999,999 bytes
...

如果没有c后缀,请注意该行为可能会令人惊讶:

find . -size  1000 # files whose size, in number of 512-byte units (rounded *up*)
                   # is 1000. So, that's file whose size in bytes ranges from
                   # 1000*512-511 (999*512+1) to 512*1000
find . -size -1000 # files whose size is 999*512 bytes or less
find . -size +1000 # files whose size is 1000*512+1 bytes or more

这就是该find实用程序的 POSIX 规范。

现在,各种find实现支持额外的后缀,但要注意相同的后缀可能会被不同的实现以不同的方式解释。

作为由@StephenKitt 指出,GNUfind支持cwbkMG字节、字、512 字节单位、kibibyte、mebibyte、gibibyte,但它的行为类似于 POSIX 所find要求的,例如与上面find . -size -12G我们的不同,find . -size "-$((12 * GiB))c"因为文件的大小(以 gibibyte 为单位)(向上舍入)严格受到限制小于 12,因此文件大小为 11GiB 或更小。

例如,find . -size -1G仅查找空文件(大小为 0 的文件)。单字节文件被视为 1GiB,因为大小会向上舍入到下一个 GiB。

忙碌盒find支持cwbk后缀,但对它们的解释与 GNU 不同find。这也是目前处理不带后缀的大小不符合 POSIX 标准

对于busybox来说findfind . -size -12G 就像find . -size "-$(( 12 * GiB ))c", 和find . -size -1的大小范围是从 0 到 511 而不仅仅是 0。

玩具盒find(例如在 Android 上)find在这方面的行为类似于 busybox(并且也是不符合 POSIX 标准)。另一个区别是后缀不区分大小写,TPE对于 tebibyte、pebibyte 和 exbibyte 也支持,并且d可以使用(十进制)附加后缀来指定单位是 1000 的幂而不是 1024。例如,-size 1kd查找正好是 1000 的文件字节(1 KB)而不是 1024 字节(1 KB)-size 1k

在 toybox 中find,后缀处理是作为其atolx()功能的一部分完成的,该功能不仅仅用于find.但请注意,由于它支持0xffff十六进制数字,因此也存在十六进制数字的冲突cbedCBED-size -0x2c不是小于 0x2 字节,而是小于 0x2c (44) 512 字节单元。并被-size 010c视为-size 8c(八进制),这是另一个 POSIX 不符合项。

自由BSD/蜻蜓BSD find支持ckMGTP(不是),但是虽然它的行为符合 POSIX 的要求,没有后缀,但当有后缀时,bwE它的行为就像 busybox/toybox 而不是 GNU 。find

sfind或者findbosh shell 的内置行为类似于 FreeBSD,除了后缀不区分大小写并且bwE受支持和八进制/十进制数字和一些乘积算术表达式(例如6x12x8k)被接受。

据我所知,所有开放BSD,网络BSD,伊鲁莫斯,索拉里斯,AIX,惠普/用户体验c仅支持 512 字节单位或POSIX 要求的字节的无后缀。

总结表:

传统/POSIX GNU 自由BSD 查找 忙碌盒 玩具盒
后缀 C CWBKMG 肌球蛋白 CWBKMGTPECWBKMGTPE 西伯克 cwbkmgtpeCWBKMGTPE (+d)
数字格式 小数 小数 小数 十二月/十月/十六进制/表达式 小数 十二月/十月/十六进制
-size $n ($n-1)*512+1 ..$n*512 ($n-1)*512+1 ..$n*512 ($n-1)*512+1 ..$n*512 ($n-1)*512+1 ..$n*512 $n*512 $n*512
-size -$n 0 .. ($n-1)*512 0 .. ($n-1)*512 0 .. ($n-1)*512 0 .. ($n-1)*512 0 .. $n*512-1 0 .. $n*512-1
-size +$n ($n*512)+1 .. ∞ ($n*512)+1 .. ∞ ($n*512)+1 .. ∞ ($n*512)+1 .. ∞ ($n*512)+1 .. ∞ ($n*512)+1 .. ∞
-size ${n}c $n $n $n $n $n $n
-size -${n}c 0 .. $n-1 0 .. $n-1 0 .. $n-1 0 .. $n-1 0 .. $n-1 0 .. $n-1
-size +${n}c $n+1 .. ∞ $n+1 .. ∞ $n+1 .. ∞ $n+1 .. ∞ $n+1 .. ∞ $n+1 .. ∞
-size $n$unit 不适用 ($n-1)*$单位+1 .. $n*$单位 $n*$单位 $n*$单位 $n*$单位 $n*$单位
-size -$n$unit 不适用 0 .. ($n-1)*$单位 0 .. $n*$unit-1 0 .. $n*$unit-1 0 .. $n*$unit-1 0 .. $n*$unit-1
-size +$n$unit 不适用 $n*$单位+1 .. ∞ $n*$单位+1 .. ∞ $n*$单位+1 .. ∞ $n*$单位+1 .. ∞ $n*$单位+1 .. ∞

因此,简而言之,为了可移植性,最好的选择是使用后缀c、仅小数的数字(不带前导零)并手动计算单位。

为了完整起见,Lglob 限定符zshkmgt不区分大小写,但pP适用于 512 字节单位,而不是 pebibyte)的行为类似于 POSIX/GNU find*(LM-12)例如,扩展到大小在 0 到 11 mebibytes 之间的文件)。


st_size1 这是返回结构的属性中报告的大小,lstat()其对于非常规文件的含义可能因系统而异。

find² FreeBSD /中的sfind谓词也有同样的区分,-Xtime例如-mtime +1匹配 2 天或更早的文件(年龄 86400*2 - ∞),而-mtime +1d匹配超过一天的文件(年龄 86400.000000001 - ∞)。对于 GNU find,另请参阅! -newermt -1day(或1 day agoyesterday)。

答案3

要补充 Stephen Kitt 提到的内容,请注意 gnu find四舍五入比较之前先将大小调整到指定的粒度!

如果你这样做

truncate --size=1000 dummy_file_1000
truncate --size=1024 dummy_file_1024

然后

find . -size 1k 
find . -size 1024c

将要不是给出相同的结果!

查找命令:-size 行为

简而言之 -find . -size 1k将列出每个大小为 [1,1024] 的文件,而find . -size 1024c只会列出实际大小恰好为 1024 字节的文件。

相关内容