このページで解説している内容は、以下の 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.txt
、readme.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
コマンドを使いこなすことで、広大なディレクトリツリーから目的のファイルを素早く見つけ出すことができます。ぜひこの機会に基本的な使い方をマスターし、日々の業務に役立ててください。