KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

Findコマンドを徹底的に使いこなす:初心者から上級者までの完全ガイド

 うちの会社ではLinuxやUnix系のインフラを利用する機会が多いです。 そのような環境でファイルやディレクトリを効率的に検索することは日常的なタスクです。そんな時に欠かせないのが「findコマンド」です。

ということで、findコマンドの基本から応用的な使い方まで、実務目線で使い方ガイド的なのを書いてみました。

目次


Findコマンドとは?

findコマンドは、指定したディレクトリ階層内でファイルやディレクトリを検索するための強力なツールです。名前、サイズ、種類、パーミッション、所有者、更新日時など、さまざまな条件を組み合わせて検索を行うことができます。

find . -name ... しか使わないのは勿体ないです。

基本的な構文

findコマンドの基本的な構文は以下の通りです:

find [検索開始ディレクトリ] [検索条件] [アクション]
  • 検索開始ディレクトリ:検索を開始するディレクトリ。省略するとカレントディレクトリから開始します。
  • 検索条件:検索対象を絞り込むための条件。複数指定可能です。
  • アクション:検索結果に対して行いたい操作。省略するとデフォルトでパスが表示されます。

例:

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

このコマンドは、/home/userディレクトリ以下で名前が.txtで終わるファイルを検索します。

主なオプションとその使い方

findコマンドには多数のオプションがありますが、ここでは特に頻繁に使用されるものを紹介します。

1. -name オプション

指定した名前にマッチするファイルを検索します。

find /path/to/search -name "filename"

ワイルドカードを使用することも可能です。

find /path/to/search -name "*.conf"

2. -iname オプション

大文字小文字を区別せずに名前で検索します。

find /path/to/search -iname "README.md"

3. -type オプション

ファイルの種類で検索します。

  • f:通常のファイル
  • d:ディレクトリ
  • l:シンボリックリンク
find /path/to/search -type f

これでディレクトリは対象になんなくなります。 意外と便利です。

4. -size オプション

ファイルサイズで検索します。

  • +:指定サイズより大きい
  • -:指定サイズより小さい
  • 指定サイズと同じ

サイズの単位:

  • c:バイト
  • k:キロバイト
  • M:メガバイト
  • G:ギガバイト
find /path/to/search -size +100M

運用作業中にたまに使います。 (ディスクを占領しているファイル洗い出したい、みたいなときですね)

5. -mtime オプション

ファイルの最終更新日時で検索します。nは日数を示します。

  • +n:n日より前
  • -n:n日以内
  • n:ちょうどn日前
find /path/to/search -mtime -7

6. -perm オプション

ファイルのパーミッションで検索します。

find /path/to/search -perm 644

7. -user および -group オプション

ファイルの所有者やグループで検索します。

find /path/to/search -user username
find /path/to/search -group groupname

オーナーがrootになっちゃってるファイルを一括で・・・ みたいなときに使いたくなりますね。

8. -exec オプション

検索結果に対してコマンドを実行します。{}は検索結果のプレースホルダー、\;で終了します。

find /path/to/search -type f -name "*.log" -exec rm {} \;

これがめっちゃつかいます。覚えてください。 ↑はログファイル全部消すっていう例ですね。 応用範囲がすごい広いです。

9. -print および -print0 オプション

検索結果を表示します。-print0はNUL文字で区切り、xargs -0と組み合わせて使用することで特殊文字を含むファイル名にも対応します。

find /path/to/search -name "*.txt" -print0 | xargs -0 grep "search_term"

実用的な使用例

↑でも簡単な使用例をつけてましたが、実務で実際に使う感じのfindコマンドの使用例をいくつか紹介します。

ファイル名で検索

指定した名前やパターンにマッチするファイルを検索します。

find /var/www -name "index.html"
find . -iname "*.jpg"

ファイルタイプで検索

特定の種類のファイルを検索します。

# ディレクトリのみを検索
find /etc -type d

# シンボリックリンクを検索
find /usr/local -type l

サイズで検索

指定したサイズ条件に基づいてファイルを検索します。

# 100MB以上のファイルを検索
find / -type f -size +100M

# 10KB以下のファイルを検索
find /tmp -type f -size -10k

更新日時で検索

最終更新日時に基づいてファイルを検索します。

# 過去7日以内に更新されたファイルを検索
find /home/user -mtime -7

# 30日以上更新されていないファイルを検索
find /var/log -mtime +30

パーミッションで検索

特定のパーミッションを持つファイルを検索します。

# 全てのユーザーに読み取り権限があるファイルを検索
find / -type f -perm /u=r

# パーミッションが755のディレクトリを検索
find /usr/local -type d -perm 755

所有者・グループで検索

特定のユーザーやグループが所有するファイルを検索します。

# ユーザー「alice」が所有するファイルを検索
find /home -user alice

# グループ「developers」に属するファイルを検索
find /var/www -group developers

複数条件の組み合わせ

複数の条件を組み合わせて検索を絞り込みます。

# 拡張子が.logで、サイズが10MB以上のファイルを検索
find /var/log -type f -name "*.log" -size +10M

# ユーザー「bob」が所有し、過去30日以内に更新されたファイルを検索
find /home/bob -user bob -mtime -30

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

検索結果に対して特定の操作を実行します。

# 検索結果のファイルを削除
find /tmp -type f -name "*.tmp" -exec rm {} \;

# 検索結果のファイルに対してバックアップを作成
find /etc -type f -name "*.conf" -exec cp {} {}.bak \;

Findコマンドと組み合わせる他のコマンド

findコマンドは他のコマンドと組み合わせることで、さらに強力な操作が可能です。

xargs コマンドとの組み合わせ

大量の検索結果を効率的に処理するために、xargsと組み合わせます。xargs も結構使い方わかりにくいコマンドなんですけど、簡単な並列処理機能をこれだけでかけちゃったりもするので、詳しくなっておくといいです。

# 検索結果を一括で削除
find /var/tmp -type f -name "*.log" -print0 | xargs -0 rm

# 検索結果のファイルに対してgzip圧縮を実行
find /home/user -type f -name "*.txt" -print0 | xargs -0 gzip

grep コマンドとの組み合わせ

特定の文字列を含むファイルを検索します。

find /var/www -type f -name "*.php" -exec grep -l "database_password" {} \;

tar コマンドとの組み合わせ

特定のファイルをアーカイブにまとめます。

find /home/user/Documents -type f -name "*.docx" | tar -cvf documents.tar -T -

パフォーマンスを向上させるテクニック

findコマンドは強力ですが、大規模なディレクトリ階層で実行すると時間がかかることがあります。実務では以下のオプションを基本的にはつけてつかうことになります。

-prune オプションを使用してディレクトリを除外

不要なディレクトリを検索から除外することで、処理速度を向上させます。

# .gitディレクトリを除外して検索
find /project -path "*/.git" -prune -o -name "*.py" -print

-maxdepth-mindepth オプションを使用

検索の深さを制限することで、不要な探索を避けます。

# カレントディレクトリとその直下のみを検索
find . -maxdepth 2 -name "*.md"

# 少なくとも2階層深いファイルを検索
find /var -mindepth 2 -name "*.conf"

ファイルシステムキャッシュを活用

ファイルシステムのインデックスを利用できるlocateコマンドと組み合わせることで、検索速度を劇的に向上させることも可能です。ただし、locateは定期的に更新されるため、最新のファイルには対応していない場合があります。

locate "*.pdf" | grep "/home/user/Documents"

Findコマンドの注意点とベストプラクティス

1. 実行前に検索条件を確認

誤って重要なファイルを削除するリスクを避けるため、まずは検索条件を確認し、-execオプションを使用する前に結果を確認しましょう。

find /path -type f -name "*.tmp"

2. -delete オプションの使用に注意

-deleteオプションを使用すると、検索結果のファイルを直接削除できますが、誤用すると取り返しのつかない損害を与える可能性があります。必ず慎重に使用しましょう。

# 注意して使用
find /tmp -type f -name "*.log" -delete

3. 絶対パスの使用

スクリプト内でfindコマンドを使用する際は、絶対パスを使用することで予期せぬディレクトリでの実行を防ぎます。

find /home/user/Documents -type f -name "*.docx"

4. パーミッションの確認

findコマンドを実行するユーザーの権限に注意し、アクセス権限のないディレクトリを検索しようとするとエラーが発生します。必要に応じてsudoを使用しましょう。

sudo find / -type f -name "config.php"

まとめ

findコマンドは、LinuxやUnix系システムにおいてファイルやディレクトリを効率的に検索するための不可欠なツールです。本記事では、基本的な使い方から高度なテクニックまでを網羅的に紹介しました。以下にポイントをまとめます。

  • 基本構文を理解する:検索開始ディレクトリ、検索条件、アクションの構成を把握しましょう。
  • 主要なオプションを習得する-name-type-size-mtimeなど、よく使うオプションをマスターしましょう。
  • 実用的な例を活用する:具体的な使用例を通じて、実際の業務に応用できるスキルを身につけましょう。
  • 他のコマンドとの組み合わせxargsgrepなどと組み合わせて、findコマンドの可能性を広げましょう。
  • パフォーマンスの最適化:検索の深さを制限したり、不要なディレクトリを除外することで、効率的な検索を実現しましょう。実務ではほぼ必須です
  • 注意点を守る:誤った操作によるリスクを避けるため、慎重にコマンドを実行し、ベストプラクティスを遵守しましょう。

てなことで、あなたの快適なfindライフのお助けになれば幸いです。


参考資料