findは、Linuxでファイルを検索するための最も人気があり強力なコマンドラインユーティリティの1つであることは間違いありませんが、瞬時の結果が必要な状況では十分な速度ではありません。コマンドラインからシステム上のファイルを検索する場合で、速度が最優先事項である場合は、使用できる別のコマンドがあります。検索 。
このチュートリアルでは、locateについて説明します。 わかりやすい例を使用したコマンド。ここに記載されているすべての手順/例は、Ubuntu16.04LTSでテストされていることに注意してください。locate 使用したバージョンは0.26です。
1。 Linuxでlocateコマンドを使用する方法
Locateコマンドは非常に使いやすいです。検索するファイル名を渡すだけです。
locate [filename]
たとえば、文字列'dir2'を含むすべてのファイル名を検索する場合は、次の方法でlocateを使用して検索できます。
注 :コマンド'locate dir2'(アスタリスクなし)は、locateが渡した名前(たとえばNAME)を*NAME*に暗黙的に置き換えるのと同じように機能します。
2。 Locateコマンドがどのように機能するか、またはなぜそれがとても速いのか
Locateが非常に高速である理由は、検索されたファイルまたはディレクトリ名のファイルシステムを読み取らないためです。実際にはデータベースを参照します(コマンド updatedb によって作成されます) )ユーザーが探しているものを見つけ、その検索に基づいて、その出力を生成します。
これは良いアプローチですが、欠点もあります。主な問題は、システム上に新しいファイルまたはディレクトリが作成されるたびに、ツールが正しく機能するようにツールのデータベースを更新する必要があることです。そうしないと、コマンドは最後のデータベース更新後に作成されたファイル/ディレクトリを見つけることができません。
たとえば、システムの「ダウンロード」ディレクトリで「tosearch」文字列を含む名前のファイルを検索しようとすると、 find コマンドは、出力に1つの結果を生成します:
しかし、locateコマンドを使用して同じ検索を実行しようとすると、出力が生成されません。
これは、ファイルがシステムで作成された後、データベース検索の検索が更新されなかったことを意味します。それでは、データベースを更新しましょう。これは、 updatedbを使用して実行できます。 指図。その方法は次のとおりです。
sudo updatedb
そして、同じ検索コマンドを再度実行すると、出力にファイルが表示されます:
同様に、ファイルまたはディレクトリが削除された後、データベースの検索が更新されていることを確認する必要があります。更新されていない場合、コマンドは検索時に出力にファイルを表示し続けます。
3。ロケートを作成する方法は、出力内の一致するエントリの数または数を印刷します
これまで見てきたように、locateコマンドは、一致したファイルの名前と、それらの完全パスまたは絶対パスを出力に生成します。ただし、必要に応じて、ツールでこのすべての情報を抑制し、代わりに一致するエントリの数または数を出力することができます。これは、 -cを使用して実行できます コマンドラインオプション。
4。既存のファイルに対応するエントリのみを印刷するようにロケートを強制する方法
この記事の前半ですでに説明したように、ファイルがシステムから削除された場合、ロケートデータベースを再度更新するまで、コマンドはそのファイル名を出力に表示し続けます。ただし、この特定のケースでは、データベースの更新をスキップしても、 -eを使用して正しい結果を出力できます。 コマンドラインオプション。
たとえば、システムから「filetosearch.txt」ファイルを削除しました。これは、ファイルを検索できなくなったfindコマンドによって確認されました:
しかし、locateを使用して同じ操作を実行すると、出力にファイルが表示されたままでした:
そして、その理由はわかっています。ファイルが削除された後、locateのデータベースが更新されなかったためです。ただし、 -eを使用する オプションでうまくいきました:
このオプションについてのロケートマニュアルページの内容は次のとおりです。「ロケートの実行時に存在するファイルを参照するエントリのみを印刷する」
5。大文字と小文字の区別を無視してロケートを作成する方法
デフォルトでは、locateコマンドが実行する検索操作では大文字と小文字が区別されます。ただし、 -i を使用して、ツールに大文字と小文字の区別を無視させることができます。 コマンドラインオプション。
たとえば、システムには「newfiletosearch.txt」と「NEWFILETOSEARCH.txt」という名前の2つのファイルがあります。したがって、ご覧のとおり、ファイル名は同じですが、大文字と小文字が異なるだけです。 場所に尋ねた場合 たとえば、「* tosearch *」を検索すると、出力には小文字の名前のみが表示されます:
ただし、-iコマンドラインオプションを使用すると、コマンドは大文字と小文字を区別せず、両方のファイル名が出力に生成されます。
6。 ASCIINULを使用して出力エントリを分離する方法
デフォルトでは、locateコマンドが生成する出力エントリは改行(\ n)文字を使用して区切られます。ただし、必要に応じて、区切り文字を変更し、改行の代わりにASCIINULを使用できます。これは、 -0を使用して実行できます コマンドラインオプション。
たとえば、上記の前のセクションで使用したのと同じコマンドを実行しましたが、-0コマンドラインオプションを追加しました:
したがって、改行区切り文字はもう存在しないことがわかります。NULに置き換えられています。
7。ロケートデータベースに関する情報を表示する方法
どのデータベースロケートが使用されているか、およびデータベースに関するその他の統計を知りたい場合は、 -Sを使用してください。 コマンドラインオプション。
8。 Locateを使用して正確なファイル名を検索する方法
デフォルトでは、locateを使用してファイル名を検索すると、渡す名前(NAMEなど)は暗黙的に*NAME*に置き換えられます。たとえば、ファイル名'testfile'を検索すると、*testfile*に一致するすべての名前が出力に生成されます。
しかし、「testfile」と完全に一致する名前のファイルを検索する必要がある場合はどうでしょうか。この場合、正規表現を使用する必要があります。正規表現は、 -rを使用して有効にできます。 コマンドラインオプション。したがって、正規表現を使用して「testfile」だけを検索する方法は次のとおりです。
locate -r /testfile$
正規表現に慣れていない場合は、ここに進んでください。
Locateにはさらに多くのオプションがありますが、ここで説明したオプションは、コマンドラインユーティリティに関する基本的なアイデアを提供し、開始するのに十分なはずです。ここで説明されているすべてのオプションを最初にLinuxマシンで試してから、ツールのマニュアルページにある他のオプションに切り替えることをお勧めします。
ご不明な点やご質問がございましたら、お気軽にコメントをお寄せください。