私のシステムでは、サイズが数ギガビットを超えるすべてのファイルを見つけたいと思います。私は使用すると思いましたが、find -size
マニュアルページには次のように記載されています。
サイズは間接ブロックを計算しません。
私が正しく理解した場合、検索はサイズが
(number of direct blocks)×(size of a block) = 10*4096 = 40MiB
。では、この値より大きいファイルをどのようにリストしますか?
編集する:マニュアルページでサポートしているので、どこか間違っているようです。ギガビットサイズ単位で。誰が私がどこに間違っているのかを見ることができますか?これを反映してタイトルが変更されました。
答え1
このリンクから状況が明確になると思いましたが、オープングループ基本仕様7号、IEEE Std 1003.1、2013エディション。以下はfind仕様から抜粋したものです。
仕様検索から抜粋
-sizeオペランドは、ファイルシステムで占有できるブロック数ではなく、ファイルサイズを表します。目的は、POSIX.1-2008システムインタフェースボリュームで定義されているst_sizeフィールドを、過去の実装で見つかったst_blocksの代わりに使用する必要があることです。少なくとも2つの理由があります:
System V および BSD では、 find は POSIX.1-2008 ボリュームで指定されたオペランドのサイズ計算にのみ st_size を使用します。 (BSDは-lsマスターノードを処理するときにst_blocksのみを使用します。)
ユーザーは通常、ファイルサイズをバイト単位で考えます。これは、lsユーティリティが-lオプションの出力に使用する単位でもあります。 (System VとBSDでは、lsは-lオプションサイズフィールドとしてst_sizeを使用し、ls -s計算にはst_blocksを使用します。POSIX.1-2008のこのボリュームはls -sを指定しません。)
このセクションを正しく理解すると、最初のセクションでは「-sizeオペランドはファイルサイズを表します」と言います。したがって、st_blocksの代わりにst_sizeを評価すると、サイズが報告されます。
はい
したがって、次のコマンドを使用できる必要があります。
# find files over 1G in size
$ find / -type f -size +1G
# find files smaller than 1G in size
$ find / -type f -not -size +1G
引用する
答え2
この声明は真剣に誤解を招く。残念な詳細を知りたくない場合は、読んだことを忘れて-size
ファイルサイズを見ているとします。
ファイルサイズは、ファイルから読み取ることができるバイト数です。 NサイズのファイルはNバイトの配列です。
c
bytes()以外の単位を渡すと、-size
コマンドfind
はファイルサイズをその単位の倍数に丸めます。たとえば、-size 11k
10,240 ~ 11,263 バイトのファイルを一致させ、-size 12345M
12,943,622,145 バイトから 12,944,670,720 バイトまでのファイルサイズをマッピングします。歴史的な理由から、基本単位はブロックと呼ばれ、値は512バイトです。
これは簡単な部分です。これで、一般的なファイルシステムでは、ファイルのデータがブロックに保存されます。ブロックサイズが512バイトのファイルシステムの場合、5123バイトファイルは11個のデータブロックを占めます(最後のブロックは部分的にのみ使用されます)。そのため、find -size 11
通常11個のブロックで構成されたファイルをマッチングします。
実際に合併症があるかもしれません。オペレーティングシステムには、ファイルを構成するすべてのブロックの場所を保存する場所が必要です。ブロックが多すぎる場合は、他のブロックのアドレスを含めるためにさらに多くのブロックを割り当てる必要があります。このようなブロックを間接ブロックと呼びます。マニュアルでは、find
これらのチャンクは考慮されていないと述べています。find
チャンクを計算せずにファイルサイズを計算するので、驚くべきことではありません。
代わりに、圧縮により、ファイルが予想より少ない数のブロックを使用できます。クラシックUnixファイルシステムは、粗い形式の圧縮のみを実装します。つまり、ヌルバイトのみで構成されるブロックは省略できます。これをスパースファイルといいます。
プログラムはファイルが割り当てられているブロックの数を知ることができますst_blocks
。stat
構造、相対的なst_size
。 GNU find は-ls
と の表示コードでのみ使用し、-printf
どの述語にも使用しません。このst_blocks
値は、ファイルがディスクで占めるスペースを大まかに表し、ファイルがまれな場合はファイルサイズより小さくなる可能性がありますが、間接ブロックを考慮しません。
1 Ext2、ext3、ext4 には 1kB、2kB、または 4kB ブロックがあります。