我发现要查找文件大小(以字节为单位),我使用“c”。
所以我可以使用 find 来查找 1000 字节的文件大小。 -尺寸1000c
但是不同类型的大小(例如 Mb、Gb 甚至位)又如何呢?我需要使用什么字符或字母?
答案1
答案2
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来说find
,find . -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
或者find
bosh 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
、仅小数的数字(不带前导零)并手动计算单位。
为了完整起见,L
glob 限定符zsh
(kmgt
不区分大小写,但pP
适用于 512 字节单位,而不是 pebibyte)的行为类似于 POSIX/GNU find
(*(LM-12)
例如,扩展到大小在 0 到 11 mebibytes 之间的文件)。
st_size
1 这是返回结构的属性中报告的大小,lstat()
其对于非常规文件的含义可能因系统而异。
find
² FreeBSD /中的sfind
谓词也有同样的区分,-Xtime
例如-mtime +1
匹配 2 天或更早的文件(年龄 86400*2 - ∞),而-mtime +1d
匹配超过一天的文件(年龄 86400.000000001 - ∞)。对于 GNU find
,另请参阅! -newermt -1day
(或1 day ago
或yesterday
)。
答案3
要补充 Stephen Kitt 提到的内容,请注意 gnu find四舍五入比较之前先将大小调整到指定的粒度!
如果你这样做
truncate --size=1000 dummy_file_1000
truncate --size=1024 dummy_file_1024
然后
find . -size 1k
find . -size 1024c
将要不是给出相同的结果!
简而言之 -find . -size 1k
将列出每个大小为 [1,1024] 的文件,而find . -size 1024c
只会列出实际大小恰好为 1024 字节的文件。