
我發現要查找檔案大小(以位元組為單位),我使用“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 也支持,並且可以使用(十進制)附加後綴來指定單位是 1000的d
冪而不是 1024。-size 1kd
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
匹配超過 1 天的文件(年齡 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 位元組的文件。