find:拡張子でファイルを探したい
find で現在地と配下のフォルダを検索し、名前が .txt で終わる通常ファイルを表示します。
コマンド例
find . -type f -name '*.txt'ツリー図で見る操作対象
理解のための模式図です。実際の端末画面ではありません。末尾の / はフォルダ、[現在地] はコマンドを実行する場所です。枝線は親子関係を表します。
work/ [現在地]
├── archive/
│ └── memo.txt
├── images/
│ └── photo.png
├── memo.txt
└── notes.txtwork/ 以下をたどり、名前が .txt で終わる通常ファイルを探します。photo.png は対象外です。'*.txt' の引用符を残して、find に検索条件を渡します。
この構造での検索結果
./archive/memo.txt
./memo.txt
./notes.txt結果の表示順は環境によって異なる場合があります。
直下の .txt だけを探す
find . -maxdepth 1 -type f -name '*.txt'上のツリー図と同じ work/ で実行します。-maxdepth 1 を検索開始場所 . の後に加えると、サブフォルダの中には進みません。
work/ 深さ0・現在地
├── memo.txt 深さ1・対象
├── notes.txt 深さ1・対象
├── archive/ 深さ1・フォルダ
│ └── memo.txt 深さ2・今回は対象外
└── images/ 深さ1・フォルダ
└── photo.png 深さ2・今回は対象外結果:同じ入力でも、3件から2件になる
ページ先頭の通常の検索では ./archive/memo.txt も含む3件です。直下だけに限定すると、表示されるのは次の2件です。表示順は保証されません。
./memo.txt
./notes.txt-type f があるため、深さ1でもフォルダ自体は表示しません。深さは検索を始めた場所を0として数えます。-maxdepth 0 では開始場所だけを調べるので、この例では通常ファイルに該当せず何も表示されません。
サブフォルダの中にしか .txt がない場合、直下検索が正常終了しても結果は0件です。「Permission denied」などのエラーが出た場合は、0件と決めつけずメッセージを確認してください。これらの検索例はファイルを変更しません。
この例はGNU find向けです。macOSなどの別のfind実装では、対応するオプションをその環境のマニュアルで確認してください。フォルダ名を探す場合はフォルダだけを検索する例へ。
検索条件を分けて読む
| 部分 | 意味 |
|---|---|
find | 指定した場所から、下の階層も順に調べるコマンドです。 |
. | 検索を始める場所。ここではターミナルの現在地です。 |
-type f | 通常ファイルだけを対象にします。フォルダは結果に含めません。 |
-name '*.txt' | 名前が .txt で終わるものを選びます。* は0文字以上の任意の文字列です。 |
-name は大文字と小文字を区別します。フォルダの中身の文章ではなく、名前を調べます。引用符は、* などをターミナル側で先に展開せず find に渡すために必要です。空白を含む名前も引用符で囲みます。
大文字・小文字を区別せずに探す
find . -type f -iname '*.txt'-name を -iname に変えます。memo.txt に加え、REPORT.TXT のように拡張子が大文字のファイルも対象になります。上のツリー図にないファイルは自動で作られません。
何も表示されないとき
条件に合うものがなければ何も表示されず、入力待ちに戻ります。検索開始場所、名前のつづり、大文字・小文字、ファイルとフォルダの違いを確認しましょう。エラーメッセージが出た場合は、検索が正常に完了したとは限りません。
名前でなくファイル内の文章を探す場合は、grep で文字を含む行を探す方法を参照してください。
使い方を順番に確認する練習を始めるときは、この手順に沿って進めます
使い方
- Linuxのターミナルを開き、
pwdとlsで現在地・対象を確認します。 - 例に出てくるファイル名・フォルダ名を、自分の環境に合わせます。読み取り・検索・コピー・移動の対象は、実際に存在するものを指定してください。
- 下の注意点を読んだうえでコマンドを入力し、Enterで実行します。
実行するとどうなる?
find で現在地と配下のフォルダを検索し、名前が .txt で終わる通常ファイルを表示します。 このコマンド例はファイルの内容を変更しません。
'*.txt' の引用符は外さないでください。シェルによる先行展開を防ぎます。
権限に関する注意:アクセス拒否の原因を調べずに、管理者権限や sudo で実行しないでください。
うまくいかないときに確認するエラーや想定と違う結果が出たときの確認ポイント
うまくいかないとき
「No such file or directory」が出たら、現在地・名前・大文字と小文字を確認します。「Permission denied」が出たら、自分が操作してよい場所か確認してください。原因を調べずに sudo を付けないでください。
対象環境:GNU/Linux・Bash。環境やバージョンによって表示が異なる場合があります。