ファイルサイズを基準にファイルを検索したい

ディスク圧迫の原因になっている大きなファイルを探したり、逆に極端に小さいファイルだけを抽出したりしたい場合がある。findコマンドの-sizeオプションを使うと、ファイルサイズを基準にファイルを検索できる。

次の3つのファイルがあるとする。

$ ls -lh
-rw-r--r-- 1 root root 5.0M Jul  5 07:49 large.txt
-rw-r--r-- 1 root root 500K Jul  5 07:49 medium.txt
-rw-r--r-- 1 root root  10K Jul  5 07:49 small.txt

-size +N で指定サイズ以上のファイルを検索する

+Nを指定すると、指定サイズより大きいファイルを検索する。単位はc(バイト)、k(キビバイト)、M(メビバイト)、G(ギビバイト)などを指定できる。

$ find . -type f -size +1M
./large.txt

5MBのlarge.txtのみが該当している。ディスク圧迫の原因となる大きなファイルを探す場合に使う。

-size -N で指定サイズ以下のファイルを検索する

-Nを指定すると、指定サイズより小さいファイルを検索する。

$ find . -type f -size -100k
./small.txt

10KBのsmall.txtのみが該当している。

サイズの範囲を指定して検索する

+N-Nを組み合わせると、サイズの範囲を指定して検索できる。

$ find . -type f -size +100k -size -5M
./medium.txt

100KBより大きく、5MB未満のmedium.txtのみが該当している。

単位と境界値の丸めに注意する

-sizeは指定した単位でファイルサイズを切り上げてから比較する。単位がMGのように大きい場合、1バイトでもサイズがあれば切り上げによって1単位分としてカウントされる。そのため、1MB未満のつもりで-size -1Mを指定しても、意図どおりに動作しない場合がある。

$ ls -l exact_1m.txt under_1m.txt
-rw-r--r-- 1 root root 1048576 Jul  5 07:49 exact_1m.txt
-rw-r--r-- 1 root root 1048575 Jul  5 07:49 under_1m.txt

$ find . -type f -size -1M

$ find . -type f -size -1048576c
./under_1m.txt

under_1m.txtは1MBちょうどより1バイト小さいファイルだが、-size -1Mでは該当しない。切り上げによってファイルサイズが1M単位としてカウントされ、-1M(1M未満)の条件を満たさなくなるためである。バイト単位で厳密に境界を指定したい場合はcサフィックスを使うとよい。

用途

-sizeは以下のような場面で役立つ。

  • ディスク圧迫の原因となる大きなファイルを特定したい場合
  • 空ファイルや極端に小さいファイルを抽出して調査したい場合
  • サイズの範囲を指定して、条件に合うファイルだけをバックアップや削除の対象にしたい場合

更新日時を基準にファイルを検索したい場合は【find -mtime】指定日数より古い(新しい)ファイルを検索する も参照。