Linux find コマンドの活用術:ファイル検索とバッチ処理

コマンドの概要

find コマンドは、Linux 環境においてファイルシステム内のディレクトリツリーを走査し、特定の条件に合致するファイルやディレクトリを検出するための標準ツールです。引数として指定されたパス以下の階層を再帰的に探索し、デフォルトでは見つかったすべてのエントリを標準出力に表示します。

単なる検索だけでなく、検出したファイルに対して他のコマンドを連鎖させて実行するなど、システム管理やバッチ処理において極めて強力な機能を提供します。

ファイルタイプとタイムスタンプ

検索対象となるファイルには以下のタイプが存在します。

  • f: 通常のファイル
  • l: シンボリックリンク
  • d: ディレクトリ
  • c: 文字デバイス
  • b: ブロックデバイス
  • s: ソケット
  • p: 名前付きパイプ (Fifo)

また、各ファイルには以下の 3 種類の時間情報が記録されています。

  • アクセス時間 (atime): ファイルが最後に読み込まれた時刻
  • 更新時間 (mtime): ファイルの内容が最後に書き換えられた時刻
  • 変化時間 (ctime): ファイルのメタデータ(権限や所有者など)が最後に変更された時刻

基本構文

find [探索パス] [検索条件] [アクション]
find [-H] [-L] [-P] [パス...] [式]

主要なオプション

検索条件を絞り込むための主なオプションは以下の通りです。

  • -amin <分>: 指定分数以内にアクセスされたファイル
  • -mmin <分>: 指定分数以内に内容が更新されたファイル
  • -mtime <日>: 指定日数以内に内容が更新されたファイル(24 時間単位)
  • -atime <日>: 指定日数以内にアクセスされたファイル(24 時間単位)
  • -ctime <日>: 指定日数以内にステータスが変更されたファイル
  • -depth: ディレクトリ自体より先にその中身を処理する
  • -exec <コマンド>: 条件に合致した場合に指定コマンドを実行
  • -maxdepth <数値>: 探索するディレクトリ階層の最大深度
  • -mindepth <数値>: 探索を開始する最小ディレクトリ深度
  • -name <パターン>: ファイル名がパターンに一致するもの
  • -path <パターン>: ファイルパスがパターンに一致するもの
  • -perm <権限>: 指定された権限を持つファイル
  • -size <サイズ>: 指定されたファイルサイズを持つもの
  • -type <タイプ>: 指定されたファイルタイプのみ検索
  • -user <ユーザー>: 指定された所有者を持つファイル
  • -group <グループ>: 指定されたグループに属するファイル
  • -delete: 検索されたファイルを削除する

実践的な使用例

ファイル内容を含む検索

特定のディレクトリ配下で、ファイル内に特定の文字列を含むものを検索します。

find /var/www -type f -name "*.conf" | xargs grep "server_name"

文件名パターンによる検索

現在のディレクトリおよびサブディレクトリにあるすべてのファイルとフォルダを表示します。

[user@server ~]$ find .

特定のディレクトリ内から、特定の接頭辞を持つログファイルを検索します。

[user@server ~]$ find /var/log -name "auth*.log"
/var/log/auth.log
/var/log/auth.log.1

複数の拡張子に一致するファイルを検索します(論理和)。

[user@server ~]$ find . \( -name "*.conf" -o -name "*.sh" \)

パス全体をパターンでマッチさせます。

[user@server ~]$ find /etc/ -path "*conf*"

正規表現を使用してパスをマッチさせます。

[user@server ~]$ find . -regex ".*\(\.conf\|\.sh\)$"

大文字小文字を区別せずに正規表現マッチを行います。

[user@server ~]$ find . -iregex ".*\(\.conf\|\.sh\)$"

否定条件の使用

特定の拡張子を持たないファイルを検出します。

[user@server ~]$ find /var/log ! -name "*.log"

ディレクトリ階層の制限

探索深度を制限して検索を行います。

# 最大深度 3 まで検索
[user@server ~]$ find . -maxdepth 3 -type f

# 深度 2 以深のみ検索
[user@server ~]$ find . -mindepth 2 -type f

時間基于の検索

タイムスタンプを利用してファイルを絞り込みます。

# 過去 7 日以内にアクセスされたファイル
[user@server ~]$ find . -type f -atime -7

# 7 日以上前にアクセスされたファイル
[user@server ~]$ find . -type f -atime +7

# 30 分以内にアクセスされたファイル
[user@server ~]$ find . -type f -amin -30

# 特定のファイルよりも新しく更新されたファイル
[user@server ~]$ find . -type f -newer /etc/passwd

ファイルの削除

条件に一致するファイルを直接削除します。

# 現在のディレクトリにあるすべての .tmp ファイルを削除
[user@server ~]$ find . -type f -name "*.tmp" -delete

権限と所有者による検索

ファイルの属性に基づいて検索を行います。

# 権限が 644 のファイルを検索
[user@server ~]$ find /home -type f -perm 644

# 所有者が www-data のファイルを検索
[user@server ~]$ find /var/www -type f -user www-data

# グループが developers のファイルを検索
[user@server ~]$ find /project -type f -group developers

# 権限が 600 ではない .key ファイルを検索
[user@server ~]$ find . -type f -name "*.key" ! -perm 600

-exec オプションとの連携

検索結果に対してコマンドを実行します。

# 所有者が root のファイルの権限を 640 に変更
[user@server ~]$ find /var/log -type f -user root -exec chmod 640 {} \;

#  home ディレクトリ内の .bak ファイルを削除
[user@server ~]$ find $HOME/ -name "*.bak" -exec rm {} \;

#  すべての .log ファイルの内容を結合して保存
[user@server ~]$ find . -type f -name "*.log" -exec cat {} \; > /var/log/combined.log

#  10 日以上前の .log ファイルをバックアップディレクトリへ移動
[user@server ~]$ find . -type f -mtime +10 -name "*.log" -exec mv {} /backup/ \;

#  ファイル名をフォーマットして表示
[user@server ~]$ find . -type f -name "*.conf" -exec printf "Config: %s\n" {} \;

ファイルサイズによる検索

容量の大きなファイルを特定します。

# 1GB を超えるファイルを検索
[user@server ~]$ find . -type f -size +1G
./data/backup_2023.tar.gz
./data/video_archive.mp4

# 詳細情報とともに表示
[user@server ~]$ find . -type f -size +800M -print0 | xargs -0 ls -l
-rw-r--r-- 1 root root 1073741824 Apr 10 2023 ./data/backup_2023.tar.gz

# サイズ順にソートして表示
[user@server ~]$ find . -type f -size +500M -print0 | xargs -0 du -h | sort -nr
6.8G    ./data/video_archive.mp4
4.0G    ./data/backup_2023.tar.gz

システム内の大容量ファイル Top 5

システム全体から最も容量を食っているファイルを探し出します。

# find / -type f -print0 | xargs -0 du -h | sort -rh | head -n 5
1.1G    /var/lib/mysql/ibdata1
377M    /opt/app/logs/access.log
100M    /usr/share/doc/manual.pdf
93M     /var/cache/apt/pkgcache.bin
84M     /home/user/downloads/archive.zip

タグ: linux find-command shell-scripting system-administration file-management

5月19日 00:23 投稿