[過去記事転記] Linuxでファイルを検索する: findコマンド

Linux
作者

Ryo Nakagami

公開

2023-01-01

更新日

2026-10-21

複数パターンのファイルを一括削除する

ノートコマンド

index.quarto_ipynb および index.quarto_ipynb_*(_1, _2, …)に マッチする通常ファイルを,カレントディレクトリ以下から再帰的に検索し,まとめて削除する.

find . -type f \( -name "index.quarto_ipynb" -o -name "index.quarto_ipynb_*" \) -delete

各オプションの意味

要素 役割
. 検索の起点となるディレクトリ.カレントディレクトリ以下を再帰的に走査する
-type f 検索対象を 通常ファイル に限定.ディレクトリやシンボリックリンクは除外される
\( ... \) 条件のグルーピング.シェルに括弧として解釈されないようにバックスラッシュでエスケープしている
-name "..." ファイル名(パスではなく basename)に対するglobパターンマッチ.* などのワイルドカードを使う場合はクォートで囲み,シェル展開を防ぐこと
-o OR 条件.デフォルトの結合は AND(暗黙の -a)なので,「いずれかにマッチ」を表現するには明示的に -o を使う
-delete マッチしたファイルを その場で削除 するアクション.-exec rm {} \; よりも高速で安全(プロセスを起動しない)

評価順序の注意点 1

find は -a(AND)が -o(OR)よりも優先順位が高いため,括弧でグループ化しないと意図しない条件評価になります.

## NG: -type f は最初の -name にしか効かず,2つ目の条件は -type f の制約を受けない
find . -type f -name "index.quarto_ipynb" -o -name "index.quarto_ipynb_*" -delete

## OK: 括弧で OR 条件を1つの式にまとめてから -type f, -delete を適用する
find . -type f \( -name "index.quarto_ipynb" -o -name "index.quarto_ipynb_*" \) -delete

論理式として読み下すと,前者は

(-type f ∧ -name A) ∨ (-name B ∧ -delete)

となり,-delete が条件Bにマッチした すべてのファイル(ディレクトリ含む)に対して発動してしまう危険性があります.

評価順序の注意点 2

  • find の式は 左から順に評価 され,-delete は条件ではなく「評価された時点で実行されるアクション」
  • -delete は必ず最後に置く
## NG: 名前判定の前に -delete が走り,docs/figures 以下が全部消える
find docs/figures -delete -name "*.png"

## OK: 条件をすべて書いた後に -delete を置く
find docs/figures -name "*.png" -delete

論理式として読み下すと,前者は

-delete ∧ -name "*.png"

となり,-delete の左側に絞り込み条件がないため,docs/figures 以下の すべてのエントリ(docs/figures 自身を含む)に対して削除が実行されます.後ろの -name "*.png" は削除後に評価されるだけで,削除対象の絞り込みにはまったく効きません.

-delete を使うときの作法

## Step 1: 対象を確認
find . -type f \( -name "index.quarto_ipynb" -o -name "index.quarto_ipynb_*" \) -print | wc -l

## Step 2: 問題なければ削除
find . -type f \( -name "index.quarto_ipynb" -o -name "index.quarto_ipynb_*" \) -delete

Exmaple 1 xargs rm で削除するパターン

-delete が使えない環境(古い find 実装)や,削除前にファイル一覧をパイプで他コマンドに渡したいときは xargs rm のパターンが使われます.

## NG: スペースや改行を含むファイル名で壊れる
find . -type f \( -name "index.quarto_ipynb" -o -name "index.quarto_ipynb_*" \) | xargs rm

## OK: NUL区切りで安全に渡す
find . -type f \( -name "index.quarto_ipynb" -o -name "index.quarto_ipynb_*" \) -print0 | xargs -0 rm
オプション 役割
-print0 find 側の出力区切りを 改行 (\n) ではなく NUL文字 (\0) にする.ファイル名にスペース・改行・引用符が含まれていても安全
xargs -0 xargs 側の入力区切りを NUL文字として扱う.-print0 とセットで使う
xargs -r 入力が空のときコマンドを実行しない(GNU拡張).マッチが0件のときに rm がエラーになるのを防ぐ
xargs -n N 1回の rm 呼び出しに渡す引数の数を制限.デフォルトでは可能な限りまとめて渡される

-delete vs xargs rm の使い分け

観点 -delete xargs rm
プロセス起動 find 内部で完結 rm を別プロセスとして起動
実行速度 速い やや遅い(ただし xargs が引数をまとめるので -exec rm {} \; よりは速い)
ファイル名の安全性 安全 -print0 + -0 でない場合,スペース・改行で破綻する
削除前のフィルタリング 不可 可能(grep などを挟める)
移植性 POSIX外(GNU/BSD find で利用可) POSIX準拠(-print0/-0 はGNU/BSD拡張)

シンプルに削除したいだけなら -delete で十分.grep でさらに絞り込みたい,削除前後にログを取りたい,など パイプライン処理が必要な場合は xargs rm を選ぶ,という整理になります.

## 例: ファイル名に特定文字列を含むものだけを削除
find . -type f \( -name "index.quarto_ipynb" -o -name "index.quarto_ipynb_*" \) -print0 \
  | grep -z '2025-' \
  | xargs -0 -r rm

glob パターンでファイル名・パスを指定する

ノートコマンド

docs/figures 以下から,fig_01.png のような 2 桁連番の図や,eda ディレクトリ配下の png を glob で検索する.

find docs/figures -type f -name "fig_[0-9][0-9].png"   # fig_01.png など
find docs/figures -type f -path "*/eda/*.png"           # eda 配下の png

glob を受け取るオプション

オプション マッチ対象
-name / -iname ファイル名 (basename) のみ.-iname は大文字小文字を無視
-path / -ipath 起点からのパス全体 (find が出力するパス文字列,例: docs/figures/eda/a.png)

使える記号

記号 意味 例
* 任意の文字列 (0 文字以上) "*.png"
? 任意の 1 文字 "fig_?.png" → fig_1.png
[...] 文字クラス.[0-9],[a-z],[!0-9] (否定) など "fig_[0-9][0-9].png"
ノートREMARKS
  • ブレース展開 {png,pdf} は使えない.ブレース展開はシェルの機能で,find の glob には存在しない.
    • クォートすれば {png,pdf} という文字列そのものとして扱われ,何もマッチしない.
    • クォートしないとシェルが -name fig.png fig.pdf に展開し,find: paths must precede expression エラーになる.
    • 複数拡張子は \( -name "*.png" -o -name "*.pdf" \) か,正規表現で書く.
  • ** (globstar) はない.ただし -path では * が / にもマッチするので,"*/eda/*.png" は eda/sub/x.png のような深い階層にもマッチする.
  • -path はパス全体への完全一致なので,起点のプレフィックスまで含めて書く.find docs/figures -path "eda/*.png" は先頭が docs/figures/ なのでマッチしない.先頭を */ にしておくのが無難.
  • パターンは必ずクォートする.クォートしないと,カレントディレクトリにマッチするファイルがあった場合にシェルが先に展開してしまう.

複数パターンのファイルを一括削除する with regex

ノート正規表現を用いた検索

index.quarto_ipynb および index.quarto_ipynb_1,index.quarto_ipynb_2 のような連番付きファイルを, 正規表現 1 本でまとめて検索する.

find . -type f -regex '.*/index\.quarto_ipynb.*$'

各オプションの意味

要素 役割
-regex PATTERN パス全体 (basename ではなく find の起点からの相対パス全体) が PATTERN に完全一致するファイルを抽出
.*/ 任意の深さのディレクトリ階層に対応する先頭部分.-regex はパス全体マッチなので,これが無いと ./index.quarto_ipynb のような直下のファイルにしかマッチしない
index\.quarto_ipynb リテラルの index.quarto_ipynb.. は正規表現のメタ文字なのでバックスラッシュでエスケープする
.*$ 末尾に任意文字列 (_1, _copy など) が続いてもマッチさせるための部分.完全一致セマンティクスを満たすためにアンカーまで書ききる
ノートREMARKS
  • -regex は -name と違ってパス全体への完全一致 (= 暗黙に ^ と $ で囲まれる) として動作する.
    • -regex 'index\.quarto_ipynb' だけでは絶対にマッチしない (パスが ./... で始まるため).
  • . をエスケープし忘れて index.quarto_ipynb と書くと,indexAquarto_ipynb のような別名にも誤マッチする.
  • -regex のデフォルト方言は GNU find では emacs (BRE 相当) で,+ や ?,|,{m,n} はそのままでは使えない.拡張正規表現を使いたいときは -regextype posix-extended を明示する.
  • macOS (BSD find) には -regextype がない.拡張正規表現を使うときは find -E <dir> -regex ... のように -E を起点ディレクトリより前に書く.
## NG: パス全体と一致しない
find docs/figures -regex 'fig_[0-9]+\.png'

## OK: 先頭に .*/ を付け,ERE を明示する
find docs/figures -regextype posix-extended -regex '.*/fig_[0-9]+\.png'

## 複数拡張子を 1 本の正規表現でまとめて削除 (glob のブレース展開の代わり)
find docs/figures -regextype posix-extended -type f -regex '.*\.(png|pdf|svg)' -delete

正規表現の方言を切り替える

GNU find は -regextype でバックエンドの正規表現エンジンを選べる.代表的なのは次の 3 つ:

## デフォルト (emacs / BRE 相当): + や | はリテラル扱い
find . -regextype emacs        -regex '.*/index\.quarto_ipynb.*$'

## POSIX 拡張正規表現: +, ?, |, {m,n} がメタ文字として効く
find . -regextype posix-extended -regex '.*/index\.quarto_ipynb(_[0-9]+)?$'

## POSIX 基本正規表現: + や ? はエスケープしないとリテラル
find . -regextype posix-basic   -regex '.*/index\.quarto_ipynb.*$'

-regextype は最初の -regex / -iregex より前に置く必要がある (パース時に方言が確定するため).

-regex vs -name の使い分け

観点 -name (glob) -regex (正規表現)
マッチ対象 basename (ファイル名のみ) パス全体 (起点からの相対パス)
マッチ方式 glob パターン (*, ?, [...]) 正規表現 (方言は -regextype で指定)
完全一致 / 部分一致 basename への完全一致 パス全体への完全一致 (= 暗黙の ^...$)
OR 条件 \( -name A -o -name B \) で表現 (A|B) を posix-extended で 1 本にまとめられる
大文字小文字を無視 -iname -iregex
直感性 高い (シェルと同じ感覚で書ける) 低め (パス先頭の .*/ を忘れやすい)

ファイル名だけで判別できるケースは -name を選んだほうがシンプル.ディレクトリ階層も条件に入れたい (例: posts/2025-*/index.quarto_ipynb 系のみ削除) ときに -regex の真価が出る.

Exmaple 2 安全な削除手順

-regex 版でも作法は -name 版と同じ.まずマッチ対象を必ず目視確認してから -delete する.

## Step 1: マッチするパスを確認
find . -type f -regex '.*/index\.quarto_ipynb.*$' -print

## Step 2: 件数を数える
find . -type f -regex '.*/index\.quarto_ipynb.*$' -print | wc -l

## Step 3: 問題なければ削除
find . -type f -regex '.*/index\.quarto_ipynb.*$' -delete

-exec でマッチしたファイルにコマンドを適用する

ノートコマンド

ディレクトリ以下にある通常ファイルすべてに実行権限を付与する.

## \; 版: ファイルごとに chmod を 1 回ずつ実行
find ~/shellutils/bin -type f -exec chmod +x {} \;

## + 版: ファイルをまとめて chmod に渡す(通常はこちら推奨)
find ~/shellutils/bin -type f -exec chmod +x {} +

\; と + の違い

-exec command {} \; と -exec command {} + はどちらも「マッチしたファイルに対してコマンドを実行する」アクションだが,コマンドの起動回数が異なる.

終端子 動作 プロセス起動回数 用途
\; マッチしたファイル 1 件ごと にコマンドを 1 回実行する マッチ件数と同じ 終了コードをファイルごとに確認したい,コマンド側が複数引数に非対応など
+ マッチしたファイルをできるだけまとめて 1 コマンドに渡す(xargs 相当) はるかに少ない(コマンドライン長の上限まで引数を積む) 速度優先・chmod/chown など複数引数対応コマンド

+ 版は xargs と同じ方式でコマンドラインを構築するため,\; 版より大幅に高速になる.ただし {} は引数リストの末尾に 1 か所だけ置けるという制約がある(GNU find の仕様).

ノートWarning
  • \; の \ はシェルに ; を解釈させないためのエスケープ.
  • + 版では {} の直後に + を置く必要があり,{}+ のようにスペースを省略することは できない.

{}(プレースホルダ)の意味

{} は find がマッチしたパスに置き換える特殊文字列(プレースホルダ). \; 版では引数の任意の位置に複数回書けますが,+ 版では末尾に 1 か所だけという制約があります.

## \; 版: {} を複数回使ってよい
find . -type f -exec echo "Found: {} → processing {}" \;

## + 版: {} は末尾に 1 か所だけ(複数書くとエラー)
find . -type f -exec chmod +x {} +

条件を追加して対象を絞り込む

「拡張子 .sh だけ」「まだ実行権限がついていないファイルだけ」のように対象を絞るには,-name や -perm を組み合わせる.

## 拡張子 .sh のファイルだけ
find ~/shellutils/bin -type f -name "*.sh" -exec chmod +x {} +

## 実行権限(u+x)がまだないファイルだけ
## -perm /0111  → u/g/o のいずれかに実行ビットが立っている
## ! -perm /0111 → いずれにも実行ビットがない(= 対象外 の否定 = 対象)
find ~/shellutils/bin -type f ! -perm /0111 -exec chmod +x {} +

## 拡張子 .sh かつ実行権限なし
find ~/shellutils/bin -type f -name "*.sh" ! -perm /0111 -exec chmod +x {} +

-perm の書き方

書き方 意味
-perm mode パーミッションビットが 完全一致 する
-perm -mode 指定したビットが すべて セットされている(AND マスク)
-perm /mode 指定したビットの いずれか がセットされている(OR マスク)
! -perm /mode 指定したビットが 1 つもセットされていない(NOT + OR マスク)

-perm /0111 は「u・g・o のいずれかに実行ビットが立っている」という意味で, ! -perm /0111 はその否定(= 誰にも実行権限がない)となる.

Exmaple 3 実行前の確認手順

-exec chmod は取り消しが難しいため,まず -print で対象ファイルを目視確認してから実行するのが安全です.

## Step 1: 対象を確認
find ~/shellutils/bin -type f ! -perm /0111 -print

## Step 2: 件数を数える
find ~/shellutils/bin -type f ! -perm /0111 -print | wc -l

## Step 3: 問題なければ実行
find ~/shellutils/bin -type f ! -perm /0111 -exec chmod +x {} +

-exec vs xargs の使い分け

観点 -exec {} + xargs
記述のシンプルさ 高い(find 1 本で完結) やや複雑(-print0 + xargs -0 が推奨)
ファイル名の安全性 安全(find が直接渡す) -print0 / -0 が必要
パイプでの加工 不可 grep などを挟める
プロセス起動 find 内部 xargs を別プロセスとして起動

単純にファイルに操作をかけるだけなら -exec {} + で十分. grep でさらに絞り込む,操作前後にログを取るなど,パイプライン処理が必要な場合は xargs を選ぶ.


更新時刻で絞り込む: -mtime / -mmin

ノートコマンド

最終更新から 7 日より古い通常ファイルを検索する.

find . -type f -mtime +7

find はファイルのタイムスタンプを条件に使える.-mtime は「最終更新 (modification time) から何日経ったか」で絞り込むテストで, 経過時間を 24 時間単位で切り捨てた日数 n と比較する.

書き方 意味
-mtime +7 経過日数 n > 7 (切り捨てなので,実質 8 日以上前に更新)
-mtime -7 経過日数 n < 7 (直近 7 日以内に更新)
-mtime 7 経過日数 n = 7 (7 日以上 8 日未満前に更新)
-mmin +60 分単位版.60 分より前に更新
-mmin -60 直近 60 分以内に更新

見ているタイムスタンプの種類

テスト タイムスタンプ 更新されるタイミング
-mtime / -mmin mtime (modification time) ファイルの中身を書き換えたとき
-atime / -amin atime (access time) ファイルを読んだとき (relatime マウントでは更新が間引かれる)
-ctime / -cmin ctime (status change time) 中身に加えて,権限・所有者・名前などのメタデータを変えたとき
-newer FILE FILE の mtime との比較 FILE より後に更新されたファイルにマッチ
ノートWARNING
  • +7 は「7 日以上」ではなく,切り捨て後の日数が 7 より大きい,つまり実質 8 日以上前を意味する.境界をきっちり指定したいときは -mmin を使う.
  • -mtime は 更新時刻 を見る.cp (-p なし) や git checkout で mtime が新しくなったファイルは,中身が古くても「新しい」と判定される.

Exmaple 4 データ分析プロジェクトでの活用例

## 古い中間生成物だけ消す: data/interim 以下の parquet のうち 8 日以上前のもの
find data/interim -type f -name "*.parquet" -mtime +7 -print   # まず確認
find data/interim -type f -name "*.parquet" -mtime +7 -delete

## 直近 1 時間にパイプラインが書き出したファイルを確認する
find data/processed -type f -mmin -60

## 生データより古い (= 再生成が必要な) 加工済みファイルを探す
find data/processed -type f ! -newer data/raw/latest.csv

サイズで絞り込む: -size

ノートコマンド

500 MiB を超える通常ファイルを検索する.

find . -type f -size +500M
書き方 意味
-size +500M 500 MiB を超える
-size -10k 10 KiB 未満 (下記の切り上げに注意)
-size 0 0 バイト (-empty でも同じ.-empty は空ディレクトリにもマッチする)
単位 c (バイト), k (KiB), M (MiB), G (GiB).省略すると 512 バイトブロック
ノート
  • -size はファイルサイズを指定単位で切り上げてから比較する.-size -1M は「1 MiB 未満」ではなく「切り上げて 0 MiB」,つまり空ファイルにしかマッチしない.小さい閾値は -size -1024k のように細かい単位で書く.
  • 単位を省略した -size +100 は 100 バイトではなく 100 ブロック (= 51200 バイト) の意味になる.バイト指定は c を付ける.

Exmaple 5 データ分析プロジェクトでの活用例

## 巨大ファイルを確認する: サイズを人間が読める形式で表示
find data -type f -size +500M -exec ls -lh {} +

## 大きい順に並べる
find data -type f -size +500M -exec du -h {} + | sort -hr

## 書き出しに失敗した空の出力ファイルを探す
find outputs -type f -empty

探索を打ち切る: -prune

ノートコマンド

.venv と .git の中は探索せずに,.py ファイルを検索する.

find . \( -name ".venv" -o -name ".git" \) -prune -o -type f -name "*.py" -print

-prune は「マッチしたディレクトリの中には潜らない」ことを find に指示するアクションで,評価結果は常に真になる. 探索そのものを打ち切るので,巨大な .venv や node_modules を除外すると検索が速くなる.

A -prune -o B -print の読み方

find . \( -name ".venv" -o -name ".git" \) -prune -o -type f -name "*.py" -print

論理式として読み下すと

(除外条件 ∧ -prune) ∨ (検索条件 ∧ -print)

となる.

  • 除外条件にマッチしたディレクトリ: -prune が真を返すので -o の右側は評価されず,中にも潜らない
  • それ以外: 左側が偽になり,右側の検索条件で判定される
ノート
  • 末尾の -print を省略すると,暗黙の -print が式全体にかかり,除外したはずの ./.venv や ./.git 自体が出力される.-prune -o を使うときは右側に必ずアクションを明示する.
  • -prune は -depth が有効なときは効かない.-delete は暗黙に -depth を有効にするため,-prune と -delete は組み合わせられない.

中身のあるディレクトリを消す: -prune + -exec rm -rf

-prune は「これから消すディレクトリの中を探索しない」用途にも使える. -delete はディレクトリに対しては rmdir 相当の動作しかせず,空のディレクトリしか消せないため,中身ごと消すときは -exec rm -rf {} + を使う.

## NG: 中身があるので消えない
find . -type d -name "__pycache__" -delete
## find: cannot delete './a/__pycache__': Directory not empty

## NG: -prune なしで \; を使うと,削除直後に find が中へ潜ろうとしてエラーになる
find . -type d -name "__pycache__" -exec rm -rf {} \;
## find: './a/__pycache__': No such file or directory

## OK: -prune で中に潜らず,rm -rf でまとめて削除する
find . -type d -name "__pycache__" -prune -exec rm -rf {} +

Exmaple 6 データ分析プロジェクトでの活用例

## Jupyter / Python のゴミ掃除
find . -type d -name ".ipynb_checkpoints" -prune -exec rm -rf {} +
find . -type d -name "__pycache__" -prune -exec rm -rf {} +

## 上の 2 本を 1 本にまとめ,まず対象を確認してから削除する
find . -type d \( -name ".ipynb_checkpoints" -o -name "__pycache__" \) -prune -print
find . -type d \( -name ".ipynb_checkpoints" -o -name "__pycache__" \) -prune -exec rm -rf {} +

## .venv と data を除外して notebook を一覧する (data 以下の大量ファイルを走査しない)
find . \( -name ".venv" -o -path "./data" \) -prune -o -type f -name "*.ipynb" -print

Appendix: Linuxのファイル

Linuxで扱われるオブジェクトは大きく分けると4つあります

種類 説明 代表例 補足
通常ファイル データそのものを格納するファイル .txt, .csv, .py, バイナリ テキストも実行ファイルも同じ分類
ディレクトリ ファイルや他のディレクトリを管理するための入れ物 /home, /etc, /usr 中身は「名前 → inode」の対応表
リンクファイル 別のファイルやディレクトリへの参照 /bin -> /usr/bin ハードリンクやシンボリックリンク
特殊ファイル デバイスや IPC(入出力・通信)をファイルとして抽象化したもの(デバイスファイル) /dev/sda, /dev/null ブロックデバイス(b) や キャラクタデバイス(c)など

Linuxでは,すべてをファイルで表します.コンピューターに接続されているデバイス(キーボード・モニタ・プリンタなど)は それぞれ対応したデバイスファイルで表されます.

ls コマンドを ls -F --color=auto のように設定した上で実行すると

  • 通常ファイル: 白色
  • ディレクトリ: 青色
  • リンクファイル(シンボリックリンク): 水色
  • 特殊ファイル: 黄色

というように表示されます.(他にも圧縮ファイルは赤色,実行ファイルは緑色など)

Windowsとの差違

Windowsでは,.txt,.exe といった拡張子が意味を持ち,アプリケーションと関連付けられていますが,Linuxではファイル名の一部に過ぎないです. Linuxではあくまで中身を見てから判断するという思想で,なにかしらの実行ファイルがどの言語で実行可能なのか?とかはshebang

#!/bin/bash

で記述する場面のほうが多いと思います.ただし,拡張子はどんな種類のファイルなのかの目安になるほか,

ls -X

のように ls コマンドでは -X を付与することで拡張子アルファベット順でファイルをソート表示できるので,ディレクトリの整理整頓という観点では 拡張子を含めファイルに適切な名前を付与することはLinuxでも重要です.

Appendix: 用語集

glossary:
  - def: NUL文字
    description: |
      文字コード 0 の制御文字で,`\0` と表記される.
      Linux のファイル名には `/` と NUL文字以外のすべての文字(スペース・改行・引用符を含む)を使えるため,
      NUL文字はファイル名の区切りとして絶対に衝突しない唯一の文字である.
      `find -print0` と `xargs -0` はこの性質を利用して,ファイル名を安全に受け渡す.

  - def: ブレース展開 (brace expansion)
    description: |
      `{a,b,c}` や `{1..5}` のような記述を,コマンド実行前に複数の単語へ展開するシェル (bash, zsh) の機能.
      例えば `ls *.{png,pdf}` はシェルによって `ls *.png *.pdf` に展開されてから実行される.
      展開はシェルが行うため,クォートして `find` に渡した文字列には適用されない.

  - def: globstar
    description: |
      `**` を「0 個以上のディレクトリ階層」にマッチさせる bash のオプション.`shopt -s globstar` で有効化する
      (zsh ではデフォルトで有効).例えば `ls **/*.png` でカレントディレクトリ以下すべての `.png` を列挙できる.
      シェルの機能であり,`find` の `-name` / `-path` の glob パターンには存在しない.

  - def: -regextype posix-extended
    description: |
      GNU `find` で `-regex` / `-iregex` が解釈する正規表現の方言を POSIX 拡張正規表現 (ERE) に指定するオプション.
      ERE では `+`, `?`, `|`, `()`, `{m,n}` をエスケープなしでメタ文字として使える.
      最初の `-regex` より前に置く必要がある.BSD `find` (macOS) では代わりに `find -E` を使う.

  - def: MiB (メビバイト)
    description: |
      2 の累乗に基づく情報量の単位で,1 MiB = 1024 KiB = 1,048,576 バイト.
      SI 接頭辞の MB (1 MB = 1,000,000 バイト) と区別するために IEC が定めた 2 進接頭辞.
      `find -size` の `k`, `M`, `G` はそれぞれ KiB, MiB, GiB を意味する.

References