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

相關內容