1. 概要

場合によっては、名前または特定の拡張子でファイルまたはファイルのセットをすばやく見つける必要があります。 ほとんどのグラフィカルファイルマネージャーにはファイル検索機能がありますが、コマンドラインで使用できる検索ツールほど柔軟で強力ではありません。

この記事では、Linuxターミナル内で名前または拡張子でファイルを検索するために使用できるいくつかの方法について説明します。 さまざまなディストリビューションに付属している組み込みのコア検索ユーティリティを使用します。

2. findを使用する

find コマンドを使用すると、ドライブ上のファイルとディレクトリを検索できます。 これは、多くのことを実行できる非常に包括的なユーティリティです。 ファイルを検索できるだけでなく、一致したファイルやディレクトリに対して操作を実行することもできます。ほとんどのLinuxディストリビューションで利用できます。 したがって、検索に関しては、通常、これが頼りになるツールです。

findの可用性を確認しましょう。

$ find --version
find (GNU findutils) 4.8.0
Packaged by Gentoo (4.8.0)
Copyright (C) 2021 Free Software Foundation, Inc.

find ユーティリティは、findutilsパッケージに同梱されています。 システムで利用できない場合は、yumやapt などのパッケージマネージャーを使用して、公式リポジトリからfindutilsパッケージをインストールできます。

2.1. 基本的なファイル検索

findの基本的な構文は単純です。

$ find [PATH] [OPTIONS] [EXPR]

デフォルトでは、パスは現在のディレクトリです。 オプションを指定せずにfindコマンドを実行すると、現在のディレクトリ内のすべてのファイルとディレクトリが一覧表示されます。 現在のディレクトリで.zshrcファイルを検索するとします。 -inameテストを使用して指定します。

$ find -iname ".zshrc"
./config/zsh/.zshrc

-iname テストでは、大文字と小文字の区別を保持する -name テストとは対照的に、大文字と小文字の区別がオフになります。 パターンに基づいてファイルを検索したい場合があります。 そのため、 -iregex または– regexテストを使用できます。

$ find -regex ".*\(zsh\|bash\)rc"
./.config/zsh/zshrc
./.config/bash/bashrc

regex テストは、ファイル名にzshを含むすべてのファイルを照合するために使用されるパターンを指定します。 または、 -iregex テストを使用して、大文字と小文字の区別を無効にすることもできます。 上記のスニペットでは、正規表現の先頭にある。*を使用してファイルのパスを出力します。ただし、拡張子でファイルを検索する場合は、を使用できます。 ]-nameまたは-iname

$ find -type f -iname "*.json"
./.mozilla/firefox/esr/shield-preference-experiments.json
./.mozilla/firefox/esr/extension-preferences.json
./.mozilla/firefox/esr/times.json

-type テストは、一致のタイプをフィルタリングするために使用されます。 この場合、ファイルを照合するだけで済みます。

2.2. 一連の拡張機能に基づく検索

場合によっては、一連の拡張子に一致するファイルを検索したいことがあります。 たとえば、PDF、EPUB、またはMarkdownのいずれかであるファイルを検索します。 幸い、findコマンドに複数の式を指定できます。

$ find -type f -name "*.pdf" -or -name "*.epub" -or -name "*.md"
./github/haidarz/README.md
./dox/freebsd_handbook.epub
./dox/annotated_cpp.pdf
./.config/zsh/plugins/fsh/README.md
./.config/zsh/plugins/fsh/CHANGELOG.md

-またはは、複数の式をチェーンする演算子です。 -not and -and など、同じように使用できる他の演算子があります。

または、正規表現を使用して上記のコマンドを記述できます。

$ find -iregex ".*.\(pdf\|epub\|md\)"
./github/haidarz/README.md
./dox/freebsd_handbook.epub
./dox/annotated_cpp.pdf
./.config/zsh/plugins/fsh/README.md
./.config/zsh/plugins/fsh/CHANGELOG.md

正規表現の「パイプ」文字は、または演算子として機能します。

3. Locateを使用する

Locate コマンドは、updatedbによって生成されたデータベースで使用可能なファイルを一覧表示します。 updatedb プログラムは、システム内のファイルとディレクトリにインデックスを付け、データベースファイルに保存します。  updatedb プログラムは、 cron によって少なくとも1日に1回実行されますが、コマンドラインから手動で実行することもできます。

Locate ユーティリティは、ファイルを検索するためにファイル階層をウォークスルーする必要がないため、findと比較してパフォーマンスが高くなります。 そのため、最適な実行時間を実現したい場合は、これが推奨されるオプションです。

システムで利用できない場合は、公式リポジトリからfindutilsまたはmlocateパッケージのいずれかをインストールできます。 Locateがインストールされたらupdatedbコマンドを実行する必要があることに注意してください。locateの可用性を確認しましょう。

$ locate --version
mlocate 0.26
Copyright (C) 2007 Red Hat, Inc. All rights reserved.
This software is distributed under the GPL v.2.

3.1. 基本的な使用法

ご存知のように、Locateはデータベース全体を検索します。 したがって、Locateはシステム全体を検索することが期待されます。 そのため、検索するための目的のパスを指定することはできません。 ただし、パターンマッチングオプションは提供されます。

まず、updatedbコマンドを使用してファイルデータベースを更新しましょう。

$ updatedb

それでは、xwaylandという正確な名前のファイルまたはパスを検索してみましょう。

$ locate xwayland -l 3
/var/db/repos/gentoo/x11-base/xwayland
/var/db/repos/gentoo/x11-base/xwayland/Manifest
/var/db/repos/gentoo/x11-base/xwayland/files

ご覧のとおり、xwaylandという名前のファイルとディレクトリが一覧表示されます。 -lまたは–limit オプションは、一致するパスの数を制限します。

3.2. 正規表現

前の例を少し変更して、 xwayland を含むパスではなく、ファイルとディレクトリのみを一覧表示します。

$ locate -r "/xwayland$"
/var/db/repos/gentoo/x11-base/xwayland

-rまたは–regex オプションは、正規表現を指定するために使用されます。 この例では、 xwayland で終わるパスをリストするため、式の最後にドル記号($)を付けます。 POSIX準拠の正規表現をlocateに指定できます。

$ locate --regex "\.(pdf|md|epub)$" -l 5
/usr/share/alsa/ucm/README.md
/usr/share/alsa/ucm2/README.md
/usr/share/bison/README.md
/usr/share/doc/argon2-20190702/argon2-specs.pdf
/usr/share/doc/bzip2-1.0.8-r1/manual.pdf

-rの代わりに–regexを使用したことに注意してください。 両方のオプションの違いは、-rを使用して基本正規表現(BRE)を指定するのに対し、–regexフラグを使用して拡張正規表現(ERE)を指定することです。 拡張正規表現は、より包括的であるため、より詳細に制御できます。 たとえば、配管機能はBREではなくEREを使用して実現されます。

3.3. 不足しているファイル

これまで見てきたように、Locateコマンドはかなりうまく機能します。 ただし、デフォルトでは、ファイルの存在を気にしないことに注意してください。 システムからファイルを削除する場合でも、ファイルはファイルデータベースに登録されたままになることに注意してください。 幸い、 Locate には、 –existingまたは-eフラグがあります。

$ locate wgetrc
/home/hey/.config/wget/wgetrc
$ rm -rf /home/hey/.config/wget/wgetrc
$ locate wgetrc
/home/hey/.config/wget/wgetrc
$ locate -e wgetrc
$

ご覧のとおり、 wgetrc ファイルを削除した後でも、 -e フラグを指定するまで、結果にwgetrcファイルが表示されます。 さらに、ファイルデータベースが更新されると解決します

4. 結論

この記事では、findおよびlocateユーティリティを使用してファイルとディレクトリを検索する方法を説明しました。 正規表現を使用して、一致するパターンに基づいてファイルとディレクトリを効果的に見つける方法を学びました。