「find . -size」コマンドのファイル サイズ オプションは何ですか?

「find . -size」コマンドのファイル サイズ オプションは何ですか?

ファイルサイズをバイト単位で調べるには、「c」を使用することがわかりました。

そこで、find . -size 1000c を使って 1000 バイトのファイルサイズを検索することができます。

しかし、Mb、Gb、ビットなどの異なる種類のサイズの場合はどうでしょうか? どのような文字を使用する必要がありますか?

答え1

POSIX接尾辞なしまたはc接尾辞のみを指定します。接尾辞がない場合、値は 512 バイトのブロックとして解釈されます。c接尾辞がある場合、値は指定したバイト数として解釈されます。

いくつかの実装では、より多くの接尾辞をサポートしています。例えば、GNUfindサポート

  • b512バイトブロックの場合
  • cバイト
  • w2バイトワードの場合
  • kキビバイト
  • Mメビバイト
  • Gギビバイト

答え2

POSIX準拠:

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

ユーティリティの POSIX 仕様については以上ですfind

現在、さまざまなfind実装で追加のサフィックスがサポートされていますが、同じサフィックスが異なる実装によって異なる解釈をされる可能性があることに注意してください。

として@StephenKitt が指摘GNUfindcwbkMGバイト、ワード、512 バイト単位、キビバイト、メビバイト、ギビバイトをサポートしますが、POSIX のfind要件に従って動作します。たとえば、ギビバイト数 (切り上げ) でのサイズが 12 未満であるファイル、つまり 11GiB 以下のファイルであるため、上記とはfind . -size -12G異なります。find . -size "-$((12 * GiB))c"

たとえば、find . -size -1G空のファイル (サイズが 0 のファイル) のみを検索します。サイズは次の GiB に切り上げられるため、1 バイトのファイルは 1GiB と見なされます。

ビジーボックスfindはサフィックスをサポートしていますcwbkが、GNUとは異なる解釈をしますfind。また、接尾辞のないサイズの扱いについてはPOSIXに準拠していない。

ビジーボックスの場合findfind . -size -12G と同様にfind . -size "-$(( 12 * GiB ))c"、 はfind . -size -10 だけではなく 0 から 511 までの範囲のサイズに対応します。

おもちゃ箱find(例えばAndroidに見られるように)findその点ではbusyboxのように動作します(またPOSIX準拠ではない)。もう 1 つの違いは、サフィックスの大文字と小文字が区別されないことです。TPEテビバイトの場合、ペビバイトとエクスビバイトもサポートされており、d(10 進数の) 追加サフィックスを使用して、単位が 1024 ではなく 1000 の累乗であることを指定できます。たとえば、-size 1kdの場合、1024 バイト (1 キビバイト) ではなく、ちょうど 1000 バイト (1 キロバイト) のファイルを検索します-size 1k

toybox ではfind、サフィックスの処理はatolx()だけでなく の機能の一部として行われますfind。ただし、 は0xffff16 進数をサポートしているため、cbedCBEDも 16 進数であるため、 との競合が発生することに注意してください。-size -0x2cは 0x2 バイト未満ではなく、 0x2c (44) 512 バイト単位未満です。 は(8 進数)-size 010cとして扱われますが-size 8c、これは POSIX 非準拠のもう 1 つの例です。

フリーBSD/ドラゴンフライBSD findサポートしますckMGTP( ではありません) が、サフィックスなしで POSIX の要件どおりに動作しますが、サフィックスがある場合はbwEGNU ではなく busybox/toybox のように動作します² 。find

sfindまたは、findboshシェルの組み込みはFreeBSDのように動作しますが、サフィックスは大文字と小文字を区別せず、bwE8進数/10進数といくつかの積算演算式(など6x12x8k)が受け入れられます。

私が知る限り、オープンBSDネットBSDイルモスソラリスエイエックスHP/UXc512 バイト単位またはPOSIX で要求されるバイトに対してのみ、サフィックスなしをサポートします。

要約表:

従来型/POSIX GNU フリーBSD 見つける ビジーボックス おもちゃ箱
接尾辞 c 翻訳 ckMGTP cwbkmgtpeCWBKMGTPE 翻訳 cwbkmgtpeCWBKMGTPE (+d)
数値形式 小数点 小数点 小数点 10進数/8進数/16進数/式 小数点 10進数/8進数/16進数
-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 バイト単位) は、POSIX/GNU のように動作しますfind(*(LM-12)たとえば、サイズが 0 から 11 メビバイトの間のファイルに展開されます)。


st_size¹ これは、返される構造体の属性で報告されるサイズであり、lstat()非通常ファイルに対するその意味はシステムによって異なる場合があります。

find² FreeBSD の/にも、述語sfindに関して同様の区別があります。-Xtimeたとえば、-mtime +1は 2 日以上経過したファイル (age 86400*2 - ∞) に一致しますが、 は-mtime +1d1 日以上経過したファイル (age 86400.000000001 - ∞) に一致します。GNU についてはfind! -newermt -1day(または1 day agoまたはyesterday) も参照してください。

答え3

スティーブン・キットが述べたことに加えて、gnu find切り上げ比較する前に、サイズを指定された粒度に調整してください。

もし、するなら

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

それから

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

意思ない同じ結果が得られます!

見るfind コマンド: -size の動作

つまり、find . -size 1kサイズが[1,1024]のすべてのファイルをリストしますが、find . -size 1024c実際のサイズがちょうど1024バイトのファイルのみをリストします。

関連情報