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

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

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

したがって、findを使用して1000バイトのファイルサイズを見つけることができます。 -サイズ1000c

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

答え1

POSIXサフィックスを指定しないか、指定されたcサフィックスのみを指定します。サフィックスがない場合、値は512バイトブロックとして解釈され、サフィックスのある値cはユーザーが決定したようにバイト数として解釈されます。

たとえば、一部の実装では、より多くのサフィックスをサポートしています。牛に似た一種の栄養findサポートする

  • 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

これはfindこのユーティリティのPOSIX仕様です。

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

〜のように@StephenKittが指摘牛に似た一種の栄養findバイト、ワード、512バイト単位、kibibyte、mebibyte、gibibyteをサポートしますが、cwbkMGPOSIXが要求するように動作します。たとえば、ファイルサイズがギアバイト(丸め)であるため、厳密に12未満に制限されるため、ファイルサイズは上記とはfind異なりfind . -size -12Gます。find . -size "-$((12 * GiB))c"11GiB以下です。

たとえば、空のfind . -size -1Gファイル(サイズが0のファイル)のみを探します。シングルバイトファイルは、サイズが次のGiBに丸められるため、1GiBと見なされます。

忙しい箱findサフィックスはサポートされていますが、cwbkGNUとは異なる方法で解釈されますfind。これも現在、サフィックスなしで処理されるサイズはPOSIXと互換性がありません。

ビジーボックスの場合findfind . -size -12G はいfind . -size "-$(( 12 * GiB ))c"同様に、find . -size -1合計のサイズはゼロではなく0から511です。

おもちゃ箱find(例:Android)は、findこの点でbusyboxと同様に動作します。POSIX規格に準拠していない)。もう1つの違いは、サフィックスは大文字と小文字を区別せずにテビバイトTPE、ペビバイト、エクビバイトにもサポートさdれています(10進数)。たとえば、-size 1kd1024バイト(1KB)の代わりに正確に1000バイト(1KB)のファイルを探します-size 1k

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

FreeBSD/トンボBSD findサポートされckMGTPていませんが、サフィックスがない場合はPOSIXのように動作しますが、サフィックスがある場合はbwEGNUではなくbusybox / toyboxのように動作します。find

sfindあるいは、findboshシェルの組み込み動作は、サフィックスが大文字と小文字を区別せずにサポートされ、bwE8進数/10進数および一部の数字がサポートされることを除いて、FreeBSDと似ています。製品算術式(例6x12x8k:)受け入れられます。

私が知る限り、皆オープンBSDネットワークBSDイルモスソラリスAIXHP/ユーザー体験c512バイト単位のみがサポートされているか、POSIXが要求するバイトサフィックスはサポートされていません。

要約表:

伝統的/POSIX 牛に似た一種の栄養 FreeBSD 探す 忙しい箱 おもちゃ箱
サフィックス CWBKMG ミオシン CWBKMGTPECWBKMGTPE ウェストバーク cwbkmgtpeCWBKMGTPE(+d)
数値形式 少数 少数 少数 12月/10月/16進数/表現式 少数 12月/10月/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*$単位-1 0 .. $n*$単位-1 0 .. $n*$単位-1 0 .. $n*$単位-1
-size +$n$unit 該当なし $n*$単位+1 .. $n*$単位+1 .. $n*$単位+1 .. $n*$単位+1 .. $n*$単位+1 ..

つまり、移植性のための最良のオプションは、接尾辞付きの小数点のみをc使用する数字(前にゼロがない)を使用し、単位を手動で計算することです。

完全性のために、Lglob修飾子zsh(大文字と小文字kmgtを区別しないがpPペビバイトではなく512バイト単位に適用されます)は、POSIX / GNUのように動作しますfind*(LM-12)例:0〜11メガバイトサイズのファイルに拡張)。


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

find²FreeBSD /の述語も、2日以上のファイルマッチング(86400 * 2 -)、1日より古いファイルマッチング(86400.000000001 -)などのsfind同じ区別を持ちます。 GNUの場合(またはまたは)も参照してください。-Xtime-mtime +1-mtime +1dfind! -newermt -1day1 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バイトのファイルのみが一覧表示されます。

関連情報