この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:8
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: find ファイル/ディレクトリ検索
SEOタイトル: Linux find コマンド完全ガイド — 検索オプション総覧

この記事の要点
  • find <条件> <アクション> が基本構文
  • 名前: -name '*.log' / 大小無視 -iname。種別: -type f(ファイル)-type d(ディレクトリ)
  • サイズ: -size +1M(1MB 超)/ 時刻: -mtime -7(7 日以内更新)
  • 権限: -perm 644 / 所有者: -user username
  • 実行: -exec rm {} \;(1 件ずつ)/ -exec cmd {} +(まとめて)/ -print0 | xargs -0
  • 除外: -prune(高速)! -path './node_modules/*'(簡易)
  • 高速代替: locate(DB ベース、リアルタイム性なし)/ fd(モダン)

find コマンドの基本構文

find条件に合致するファイル / ディレクトリを再帰的に検索する Linux の万能ツール。基本構文は次の通りです:

find [検索開始ディレクトリ] [条件] [アクション]

# 例: カレント以下から .log ファイルを表示
find . -name '*.log' -print

# -print は省略可(デフォルトアクション)
find . -name '*.log'

# 複数開始位置
find /var/log /tmp -name '*.log'

主要オプション一覧

分類オプション意味
名前-name PATTERNワイルドカードで名前一致(大小区別)
-iname PATTERN大小無視
-regex PATTERN正規表現で全パス一致
種別-type f通常ファイル
-type d / l / b / c / p / sディレクトリ / シンボリックリンク / その他
サイズ-size +1M1 MiB 超
-size -100k100 KiB 未満
-size 0サイズが 0
時刻-mtime -77 日以内に更新
-mtime +3030 日より前に更新
-mmin -1010 分以内に更新
所有・権限-user NAME / -group NAME所有者・グループ一致
-perm 644 / -perm -u+wパーミッション
深さ-maxdepth N / -mindepth N再帰の深さ制限
アクション-print / -print0パス出力(NUL 区切り)
-deleteマッチしたものを削除
-exec CMD {} \; / {} +外部コマンド実行

名前で検索

# .log ファイルを全て表示
find /var/log -name '*.log'

# 大文字小文字を区別しない
find . -iname 'readme*'

# 正規表現
find . -regex '.*\.\(jpg\|png\)$'

# 拡張正規表現
find . -regextype posix-extended -regex '.*\.(jpg|png|gif)$'

# 否定(!)
find . ! -name '*.tmp'

サイズで検索

# 100 MB を超えるファイル
find / -type f -size +100M 2>/dev/null

# 0 バイト(空ファイル)
find . -type f -size 0

# 1 GB 超のファイルをサイズ降順で
find / -type f -size +1G -exec ls -lh {} \; 2>/dev/null | sort -k5 -h -r

# ディスク使用量 Top10(大容量ディレクトリ)
find /var -type d -exec du -sh {} \; 2>/dev/null | sort -rh | head -10

更新時刻で検索

# 今日変更されたファイル
find . -mtime 0

# 7 日以内に変更
find . -mtime -7

# 30 日以上前に変更(古いファイル)
find . -mtime +30

# 分単位(直近 10 分)
find . -mmin -10

# アクセス時刻 -atime / ステータス変更時刻 -ctime も同じ書き方

# 基準ファイルより新しい
find . -newer /tmp/marker.txt

# 期間指定(7 日前から 30 日前の間)
find . -mtime +7 -mtime -30

所有者・権限で検索

# 特定ユーザーのファイル
find /home -user alice
find /home -uid 1001

# パーミッション一致
find . -perm 644

# 「読み書きあり」のような条件指定
find . -perm -u+w        # 所有者に書込権限がある
find . -perm -o+w        # other に書込権限がある(危険)
find / -perm -4000       # SUID ビット付き
find / -perm -2000       # SGID ビット付き

# 「世界書込可」の脆弱なファイルを探す
find / -type f -perm -o+w 2>/dev/null

除外・深さ制限

# node_modules を除外(簡易)
find . -name '*.js' ! -path './node_modules/*'

# 高速な除外: -prune(その中に降りない)
find . -name node_modules -prune -o -name '*.js' -print

# .git も除外する場合
find . \( -name node_modules -o -name .git \) -prune -o -type f -print

# 浅い検索(直下のみ)
find . -maxdepth 1 -type f

# 2 階層下まで
find . -maxdepth 2 -type d

-exec / xargs と組み合わせる

# 1 件ずつ実行(遅い)
find . -name '*.tmp' -exec rm {} \;

# まとめて実行(速い、xargs 相当)
find . -name '*.tmp' -exec rm {} +

# xargs と組み合わせ(NUL 区切りで安全)
find . -name '*.tmp' -print0 | xargs -0 rm

# 並列実行
find . -name '*.png' -print0 | xargs -0 -P 4 -n 100 optipng

# 削除アクション(外部 rm 不要、最速)
find . -name '*.tmp' -delete

# 確認しながら削除(-ok)
find . -name '*.tmp' -ok rm {} \;
# → < rm ... /path/file.tmp > ?  と聞かれる

実用例集

# 1. ログを 7 日経過したら自動削除
find /var/log/myapp -name '*.log' -mtime +7 -delete

# 2. 大きい順 Top 10 のファイル
find / -type f -printf '%s %p\n' 2>/dev/null | sort -nr | head -10

# 3. 空ディレクトリを一括削除
find . -type d -empty -delete

# 4. 特定拡張子の文字コード一括変換
find . -name '*.txt' -exec iconv -f Shift_JIS -t UTF-8 -o {}.utf8 {} \;

# 5. 改行コード LF → CRLF(テキストファイルのみ)
find . -name '*.txt' -exec unix2dos {} +

# 6. シンボリックリンク切れを検出
find . -xtype l

# 7. 壊れた .git ディレクトリを探す
find / -type d -name '.git' 2>/dev/null

locate / fd との比較

コマンド方式速度長所短所
find毎回ファイルシステムを走査遅い条件指定が最強。リアルタイム大規模だと時間がかかる
locate事前構築 DB を検索非常に速い名前検索なら一瞬DB 更新(updatedb)まで反映なし
fd並列ファイルシステム走査速いシンプル構文、デフォルトで .gitignore 尊重別途インストール(Rust 製)

FAQ

Q: -exec rm {} \;{} + の違い
A: \; はマッチ 1 件ごとに rm をフォーク(遅い)。+ はまとめて rm file1 file2 ...(高速、xargs と同等)。

Q: パスにスペースや日本語があるとき
A: -print0 + xargs -0 または -exec ... + を使えば安全。-print | xargs は危険。

Q: 「Permission denied」が大量に出る
A: 末尾に 2>/dev/null を付けて標準エラーを捨てる。または対象を $HOME 配下に絞る。