このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:ディレクトリツリーからファイルを探す:findコマンド

ディレクトリツリーからファイルを探す:findコマンド

 Linuxシステムでは、数多くのファイルやディレクトリが存在し、ユーザーがそれら全ての場所を覚えるのは現実的ではありません。日々の作業で新たに作成されるファイルも増えていきます。

 そこで、目的のファイルやディレクトリを効率的に見つけ出すために、findコマンドが用意されています。findコマンドを活用することで、広大なディレクトリツリーから特定の条件に合致するファイルを素早く検索できます。ここでは、findコマンドの基本的な使い方や、よく使われる検索条件について詳しく解説します。

findコマンド:ディレクトリツリーからファイルを探す

 findコマンドは、その名の通りファイルを検索するための強力なツールです。他のコマンドに比べてオプション指定の方法が少々複雑ですが、一度使い方を覚えると非常に便利です。

【書式】
find <検索開始ディレクトリ> <検索条件> <アクション>

  • 検索開始ディレクトリ:検索を開始するディレクトリを指定します。
  • 検索条件:検索の条件を指定します(例:ファイル名、ファイルタイプなど)。
  • アクション:条件に合致したファイルに対して実行する動作を指定します(デフォルトは-printでパスを表示)。

基本的な使い方

 たとえば、現在のディレクトリ(.)を起点として、名前がfile.txtのファイルを検索し、そのパスを表示する場合は以下のようにします。

find . -name file.txt -print
  • 検索条件-name file.txtでファイル名がfile.txtであるものを指定。
  • アクション-printで見つかったファイルのパスを表示。

なお、アクションを省略した場合、自動的に-printが指定されたものとして扱われます。

使用例:基本的な使い方

まず、作業ディレクトリに移動します。

user01@ubuntu:~$ cd work
user01@ubuntu:~/work$

テスト用のファイルとディレクトリを作成します。

user01@ubuntu:~/work$ mkdir -p dir/doc
user01@ubuntu:~/work$ touch file.txt readme.txt dir/doc/file.txt

findコマンドを実行して、file.txtを検索します。

user01@ubuntu:~/work$ find . -name file.txt -print
./file.txt
./dir/doc/file.txt

結果:カレントディレクトリとそのサブディレクトリ内にあるfile.txtが全て表示されます。

 findコマンドは指定したディレクトリ以下のすべての階層を再帰的に検索するため、深いディレクトリにあるファイルも容易に見つけることができます。

よく使われる検索条件

findコマンドには多くの検索条件がありますが、特によく使われる以下の3つを紹介します。

ファイル名で探す(-name-iname

  • -name:指定したファイル名と完全一致するファイルを検索(大文字・小文字を区別)。
  • -iname:指定したファイル名と完全一致するファイルを検索(大文字・小文字を区別しない)。

使用例:ファイル名が.txtで終わるファイルを検索する場合

user01@ubuntu:~/work$ find . -name '*.txt' -print
./file.txt
./dir/doc/file.txt
./readme.txt

ポイント

  • -name オプションで *? を使用する際には、必ず '(シングルクオート) または "(ダブルクオート) でパターンを囲みます。
  • これは、*? がシェル(bash)によるパス名展開(グロブ展開)として解釈されないようにするためです。

クォートを忘れた場合の問題

 クォートを付けずにワイルドカードを使用すると、シェルがパス名展開を行ってしまい、意図しない動作になります。

user01@ubuntu:~/work$ find . -name *.txt -print
find: paths must precede expression: `readme.txt'
find: possible unquoted pattern after predicate `-name'?

解説

  • *.txt がシェルによって展開され、実在するファイル名(例:file.txtreadme.txt)に置き換えられます。
  • その結果、find コマンドには以下のように解釈され、誤った引数が渡されます。bashコードをコピーする$ find . -name file.txt readme.txt -print
  • -name オプションに複数のファイル名が指定された形となり、find コマンドはエラーを出力します。

正しい方法:クォートでパス名展開を防ぐ

user01@ubuntu:~/work$ find . -name '*.txt' -print
./file.txt
./dir/doc/file.txt
./readme.txt

ポイント

  • クォートで囲むことで、シェルのパス名展開を防ぎ、find コマンドに正しくパターンが渡されます。
  • シェルが解釈する特殊な文字(メタ文字)をコマンドに渡す際には、クォートを使用してシェルの展開を抑制する必要があります。

ファイルの種類で探す(-type

 -type オプションを使用することで、ファイルの種類によって検索条件を絞り込むことができます。指定できるファイルタイプは以下の通りです。

指定ファイル種類
-type f通常のファイル
-type dディレクトリ
-type lシンボリックリンク
ファイルの種類による検索条件

使用例:ディレクトリのみを検索する場合

 カレントディレクトリとその下のディレクトリが表示されます(通常のファイルは表示されません)。

user01@ubuntu:~/work$ find . -type d -print
.
./dir
./dir/doc

複数の検索条件の指定(-a

 findコマンドでは、複数の検索条件を組み合わせることができます。-a(AND)を使うことで、複数の条件を同時に指定して絞り込み検索が可能です。

使用例:通常ファイル(-type f)で、かつファイル名が.txtで終わるファイルを検索

user01@ubuntu:~/work$ mkdir text.txt
user01@ubuntu:~/work$ ls -F
dir/  file.txt  readme.txt  text.txt/
user01@ubuntu:~/work$ find . -type f -a -name '*.txt' -print
./file.txt
./dir/doc/file.txt
./readme.txt
  • 検索条件1-type f(通常ファイル)
  • AND
  • 検索条件2-name '*.txt'(ファイル名が.txtで終わる)

-aの省略

-aは省略可能で、検索条件をスペースで区切って並べるだけでもAND検索となります。

user01@ubuntu:~/work$ find . -type f -name '*.txt' -print
./file.txt
./dir/doc/file.txt
./readme.txt

不要となったファイルやディレクトリの削除

不要となったファイルやディレクトリを削除します。

user01@ubuntu:~/work$ rm -r dir text.txt file.txt readme.txt 

まとめ

  • findコマンドは、指定したディレクトリ以下のファイルやディレクトリを条件に基づいて検索する強力なツールです。
  • 基本書式find <検索開始ディレクトリ> <検索条件> <アクション>
  • よく使われる検索条件
    -name:ファイル名を指定して検索(大文字・小文字を区別)
    -iname:ファイル名を指定して検索(大文字・小文字を区別しない)
    -type:ファイルの種類を指定して検索(f:通常ファイル、d:ディレクトリ、l:シンボリックリンク)
  • クォートの重要性:シェルのパス名展開を防ぐために、ワイルドカードを含むパターンはクォートで囲む必要があります。
  • 複数条件の組み合わせ-a(AND)を使って複数の条件を組み合わせて検索が可能

 findコマンドを使いこなすことで、広大なディレクトリツリーから目的のファイルを素早く見つけ出すことができます。ぜひこの機会に基本的な使い方をマスターし、日々の業務に役立ててください。