16.

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 配下に絞る。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ls ファイル/ディレクトリ一覧表示
  2. sudo ユーザー指定
  3. cron/crontab ジョブの自動実行と登録方法
  4. wget http通信によるファイルダウンロード
  5. rm ファイル/ディレクトリ削除
  6. pwd カレントディレクトリの表示
  7. cd ディレクトリの移動
  8. ./configure
  9. make
  10. make install
  11. unzip ファイルの解凍
  12. mv ファイル/ディレクトリの移動および名称変更
  13. mkdir ディレクトリの作成
  14. touch 空ファイルの新規作成
  15. vi テキストディタの使用
  16. find ファイル/ディレクトリ検索
  17. grep 文字列の検索
  18. tail ファイルの末尾表示
  19. curl HTTP通信によるリクエスト
  20. nslookup ドメインのIP解決
  21. apt update パッケージリストの情報を更新
  22. apt upgrade パッケージの更新
  23. ln リンク/ショートカットの作成と削除
  24. rsync ファイル/ディレクトリの同期
  25. ssh リモートとの暗号化通信
  26. scp sshを利用したファイルのコピー
  27. unzip zip ファイルを解凍する
  28. cp ファイル/ディレクトリのコピー
  29. diffファイルの差分抽出
  30. fdisk ハードディスクに対する操作
  31. lsblk デバイスをツリー状で表示する
  32. kill プロセスを終了させる
  33. zip ファイルやディレクトリをzip形式に圧縮する
  34. host ドメインからIPアドレスを確認
  35. chmod 権限の変更
  36. ip IPアドレスの確認
  37. chown ファイル/ディレクトリ所有者の変更
  38. chgrp ファイル/ディレクトリのグループ情報の変更
  39. nohupと'&' プログラムのバックグラウンド実行(ssh接続時)
  40. lsof 開いているポート番号の確認
  41. tar ファイルの圧縮と解凍
  42. file ファイルの種類を表示
  43. cat ファイルの中身を表示
  44. head ファイルの先頭部分を表示
  45. wc 行数/単語数/文字数を確認
  46. shutdown システムのシャットダウンと再起動
  47. ps プロセスの確認
  48. which コマンドの絶対パスを調べる
  49. yum RedHat系ディストリビューションの管理
  50. mount ファイルシステムのマウント
  51. 特定フォルダ以下の特定拡張子のファイルを再帰的に削除する方法
  52. 特定のフォルダとそのサブフォルダ内にある特定のファイル名のファイルを再帰的に削除