ファイルサイズをバイト単位で見つけるには「c」を使用することがわかりました。
したがって、findを使用して1000バイトのファイルサイズを見つけることができます。 -サイズ1000c
しかし、Mb、Gb、ビットなどのさまざまな種類のサイズはどうですか?どの文字または文字を使用する必要がありますか?
答え1
POSIXサフィックスを指定しないか、指定されたc
サフィックスのみを指定します。サフィックスがない場合、値は512バイトブロックとして解釈され、サフィックスのある値c
はユーザーが決定したようにバイト数として解釈されます。
たとえば、一部の実装では、より多くのサフィックスをサポートしています。牛に似た一種の栄養find
サポートする
b
512バイトブロックの場合c
バイト用w
2バイトの単語の場合k
キロバイトM
メガバイトG
ギガバイト
答え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が指摘、牛に似た一種の栄養find
バイト、ワード、512バイト単位、kibibyte、mebibyte、gibibyteをサポートしますが、cwbkMG
POSIXが要求するように動作します。たとえば、ファイルサイズがギアバイト(丸め)であるため、厳密に12未満に制限されるため、ファイルサイズは上記とはfind
異なりfind . -size -12G
ます。find . -size "-$((12 * GiB))c"
11GiB以下です。
たとえば、空のfind . -size -1G
ファイル(サイズが0のファイル)のみを探します。シングルバイトファイルは、サイズが次のGiBに丸められるため、1GiBと見なされます。
忙しい箱find
サフィックスはサポートされていますが、cwbk
GNUとは異なる方法で解釈されますfind
。これも現在、サフィックスなしで処理されるサイズはPOSIXと互換性がありません。。
ビジーボックスの場合find
、find . -size -12G
はいfind . -size "-$(( 12 * GiB ))c"
同様に、find . -size -1
合計のサイズはゼロではなく0から511です。
おもちゃ箱find
(例:Android)は、find
この点でbusyboxと同様に動作します。POSIX規格に準拠していない)。もう1つの違いは、サフィックスは大文字と小文字を区別せずにテビバイトTPE
、ペビバイト、エクビバイトにもサポートさd
れています(10進数)。たとえば、-size 1kd
1024バイト(1KB)の代わりに正確に1000バイト(1KB)のファイルを探します-size 1k
。
toyboxでは、find
サフィックスの処理は機能atolx()
の一部として実行されます。これは16進数をサポートしているため、16進数とも競合が発生することfind
に注意してください。 0x2バイト以上 0x2c(44) 512バイト単位。 (8進数)として扱われます。これは別のPOSIX非準拠です。0xffff
cbedCBED
-size -0x2c
-size 010c
-size 8c
FreeBSD/トンボBSD find
サポートされckMGTP
ていませんが、サフィックスがない場合はPOSIXのように動作しますが、サフィックスがある場合はbwE
GNUではなくbusybox / toyboxのように動作します。find
sfind
あるいは、find
boshシェルの組み込み動作は、サフィックスが大文字と小文字を区別せずにサポートされ、bwE
8進数/10進数および一部の数字がサポートされることを除いて、FreeBSDと似ています。製品算術式(例6x12x8k
:)受け入れられます。
私が知る限り、皆オープンBSD、ネットワークBSD、イルモス、ソラリス、AIX、HP/ユーザー体験c
512バイト単位のみがサポートされているか、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
使用する数字(前にゼロがない)を使用し、単位を手動で計算することです。
完全性のために、L
glob修飾子zsh
(大文字と小文字kmgt
を区別しないがpP
ペビバイトではなく512バイト単位に適用されます)は、POSIX / GNUのように動作しますfind
(*(LM-12)
例:0〜11メガバイトサイズのファイルに拡張)。
st_size
1これは返された構造の属性に報告されたサイズであり、lstat()
非正規ファイルの意味はシステムによって異なる場合があります。
find
²FreeBSD /の述語も、2日以上のファイルマッチング(86400 * 2 -)、1日より古いファイルマッチング(86400.000000001 -)などのsfind
同じ区別を持ちます。 GNUの場合(またはまたは)も参照してください。-Xtime
-mtime +1
-mtime +1d
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バイトのファイルのみが一覧表示されます。