Linuxのfindコマンド徹底解説|ファイル検索の基本から応用まで

Linux

Linuxでファイルを探すとき、最も強力で柔軟なのがfindコマンドです。

「ファイル名がわからない」「ディレクトリが深すぎて探せない」「更新日時やサイズで探したい」など、複雑な条件でも一発で見つけられるのがfindの魅力です。

この記事では、Linuxのfindコマンドについて、基本的な使い方から便利な応用例までわかりやすく紹介します。

スポンサーリンク

findコマンドの基本的な使い方

基本構文の理解

findコマンドの基本形はとてもシンプルです:

find 検索開始ディレクトリ 条件 動作

実際の例:

find /home/user -name "test.txt"

この場合、/home/userディレクトリ以下のすべてのサブディレクトリからtest.txtという名前のファイルを探します。

カレントディレクトリから検索する方法

多くの場合は現在いるディレクトリから探すので、次のように書きます:

find . -name "test.txt"

.(ピリオド)は「現在のディレクトリ」を指すため、覚えておくと便利です。

ワイルドカードを使った名前検索

特定の拡張子のファイルを全て探したい場合は、ワイルドカードを使用します:

find . -name "*.txt"

このコマンドで、カレントディレクトリ以下のすべての.txtファイルが見つかります。

注意点:ワイルドカードはクォートで囲む

ワイルドカード(*?)を使うときは、必ずクォートで囲みましょう。クォートがないと、シェルが先にワイルドカードを展開してしまい、期待した結果にならない場合があります。

ファイル名以外の条件で検索する方法

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

大きなファイルや小さなファイルを探したい場合に便利です:

1MB以上のファイルを探す

find . -size +1M

1MB未満のファイルを探す

find . -size -1M

サイズの単位について

  • c:バイト
  • k:キロバイト
  • M:メガバイト
  • G:ギガバイト

更新日時による検索

ログファイルの整理や、最近変更されたファイルを見つけるときに役立ちます:

7日以内に更新されたファイル

find . -mtime -7

30日以上前に更新されたファイル

find . -mtime +30

時間単位での検索

find . -mmin -60  # 60分以内に更新
find . -mmin +120 # 120分以上前に更新

ファイルタイプによる検索

ファイルの種類を指定して検索することもできます:

ディレクトリのみを検索

find . -type d

通常ファイルのみを検索

find . -type f

シンボリックリンクのみを検索

find . -type l

パーミッションや所有者による検索

セキュリティチェックやファイル管理で重要な機能です:

特定の所有者のファイルを探す

find . -user www-data

特定のグループのファイルを探す

find . -group apache

特定のパーミッションのファイルを探す

find . -perm 0777  # 正確に777のファイル
find . -perm -644  # 最低でも644の権限があるファイル

複数条件を組み合わせた検索

AND条件(複数条件を同時に満たす)

複数の条件をすべて満たすファイルを探す場合:

find . -name "*.log" -size +1M -mtime -7

これは「拡張子が.logで、1MB以上で、7日以内に更新されたファイル」を探します。

OR条件(いずれかの条件を満たす)

いずれかの条件を満たすファイルを探す場合は-oオプションを使用します:

find . \( -name "*.txt" -o -name "*.log" \)

括弧を使って条件をグループ化し、エスケープ(\)を付けるのを忘れないようにしましょう。

NOT条件(条件を満たさない)

特定の条件を除外したい場合は!(NOT演算子)を使用します:

find . -type f ! -name "*.tmp"

これは「.tmpファイル以外のすべての通常ファイル」を探します。

検索結果に対して操作を実行する

-deleteオプションで即座に削除

古いログファイルやキャッシュファイルを一括削除するときに便利です:

find /var/log -name "*.log" -mtime +30 -delete

重要:削除は慎重に -deleteを使う前に、まず-deleteを付けずに実行して、削除対象のファイルを確認することをおすすめします。

-execオプションで任意のコマンドを実行

見つかったファイルに対して、個別にコマンドを実行できます:

ファイルの詳細情報を表示

find . -name "*.conf" -exec ls -l {} \;

ファイルを個別に圧縮

find . -name "*.log" -exec gzip {} \;

{}\;の意味

  • {}:見つかったファイル名に置き換わる
  • \;-execコマンドの終了を示す

-execと+オプションの使い分け

効率を重視する場合は、\;の代わりに+を使用します:

find . -name "*.txt" -exec rm {} +

この方法では、複数のファイルを一度にコマンドに渡すため、処理が高速になります。

xargsとの組み合わせ

大量のファイルを効率的に処理したい場合はxargsと組み合わせます:

find . -name "*.log" -print0 | xargs -0 rm

-print0-0の重要性 ファイル名に空白文字が含まれていても正しく処理できるようにするオプションです。これを使わないと、空白を含むファイル名で予期しない動作が起こる可能性があります。

実践的なfindコマンド活用例

システム管理でよく使う検索パターン

大きなファイルを見つけてディスク容量を確保

find / -type f -size +100M 2>/dev/null | head -10

設定ファイルのバックアップを探す

find /etc -name "*.bak" -o -name "*.orig"

最近作成されたファイルを確認

find . -type f -newermt "2024-01-01"

開発作業でよく使う検索パターン

特定の文字列を含むファイルを探す(grep併用)

find . -name "*.php" -exec grep -l "function" {} \;

空のディレクトリを見つける

find . -type d -empty

重複ファイルの候補を探す(同サイズのファイル)

find . -type f -printf "%s %p\n" | sort -n | uniq -d -w10

エラーメッセージの対処法

「Permission denied」が表示される場合

権限のないディレクトリを検索しようとしたときに表示されます:

find / -name "*.conf" 2>/dev/null

2>/dev/nullを追加することで、エラーメッセージを非表示にできます。

findが遅い場合の対処法

検索範囲を絞ったり、条件を最適化したりすることで高速化できます:

# 悪い例:全体を検索してから絞り込み
find / -name "*.txt" | grep user

# 良い例:最初から範囲を限定
find /home/user -name "*.txt"

よくある質問と解決方法

locateコマンドとの使い分けは?

  • find:リアルタイム検索、条件が複雑な場合
  • locate:高速検索、単純なファイル名検索

grepと組み合わせるときの注意点

ファイル内容で検索する場合は、まずfindでファイルを絞り込んでからgrepを使うと効率的です:

find . -name "*.log" -exec grep "ERROR" {} +

正規表現を使った検索は可能?

-regexオプションを使用することで、正規表現による検索も可能です:

find . -regex ".*\.\(jpg\|png\|gif\)"

まとめ

Linuxのfindコマンドは、以下の特徴を持つ強力なツールです:

  • サブディレクトリも含めた再帰検索が可能
  • サイズ・更新日時・パーミッションなど多彩な条件指定
  • **-delete-exec**でそのまま操作を実行
  • 複数条件の組み合わせで複雑な検索も対応

コメント

タイトルとURLをコピーしました