
ファイルサイズをバイト単位で調べるには、「c」を使用することがわかりました。
そこで、find . -size 1000c を使って 1000 バイトのファイルサイズを検索することができます。
しかし、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
ユーティリティの POSIX 仕様については以上ですfind
。
現在、さまざまなfind
実装で追加のサフィックスがサポートされていますが、同じサフィックスが異なる実装によって異なる解釈をされる可能性があることに注意してください。
として@StephenKitt が指摘、GNUfind
cwbkMG
バイト、ワード、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に準拠していない。。
ビジーボックスの場合find
、find . -size -12G
はと同様にfind . -size "-$(( 12 * GiB ))c"
、 はfind . -size -1
0 だけではなく 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
。ただし、 は0xffff
16 進数をサポートしているため、cbedCBED
も 16 進数であるため、 との競合が発生することに注意してください。-size -0x2c
は 0x2 バイト未満ではなく、 0x2c (44) 512 バイト単位未満です。 は(8 進数)-size 010c
として扱われますが-size 8c
、これは POSIX 非準拠のもう 1 つの例です。
フリーBSD/ドラゴンフライBSD find
サポートしますckMGTP
( ではありません) が、サフィックスなしで POSIX の要件どおりに動作しますが、サフィックスがある場合はbwE
GNU ではなく busybox/toybox のように動作します² 。find
sfind
または、find
boshシェルの組み込みはFreeBSDのように動作しますが、サフィックスは大文字と小文字を区別せず、bwE
8進数/10進数といくつかの積算演算式(など6x12x8k
)が受け入れられます。
私が知る限り、オープンBSD、ネットBSD、イルモス、ソラリス、エイエックス、HP/UXc
512 バイト単位または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 +1d
1 日以上経過したファイル (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 1k
サイズが[1,1024]のすべてのファイルをリストしますが、find . -size 1024c
実際のサイズがちょうど1024バイトのファイルのみをリストします。