Findコマンドを使用してLinux上のファイルとディレクトリを検索|Opensource.com

私がどのように整理されているかにかかわらず、ファイルを見つけることができないときが常にあるようです。 私は最初の場所でファイルの名前を覚えていないので、時にはそれがあります。 他の回、私は名前を知っていますが、私はそれを保存することを決めた場所を思い出すことはできません。 最初に作成しなかったファイルが必要な場合もあります。 しかし、どんな疑問があっても、私はPOSIXシステムでは、私はいつもfindコマンドを持っていることを知っています。

findのインストール

findコマンドはPOSIX仕様によって定義されており、POSIXシステム(Linux、BSD、macOSを含む)を測定するためのオープン標準を作成しています。 簡単に言えば、Linux、BSD、またはmacOSを実行している限り、すでにfindがインストールされています。

しかし、すべてのfindコマンドが完全に似ているわけではありません。 たとえば、GNUfindコマンドには、BSD、Busybox、Solarisfindコマンドにはない機能や、実装が異なる機能があります。 この記事では、FINDUTILSパッケージのGNUfindを使用しています。 この記事で示されているほとんどのコマンドはfindの他の実装で動作しますが、Linux以外のプラットフォームでコマンドを試してみて、予期しない結果が得られた場合は、GNUバージョンをダウンロードしてインストールしてみてください。

名前でファイルを検索する

正規表現を使用して完全なファイル名またはファイル名の一部を指定すると、ファイル名でファイルを検索できます。 findコマンドには、検索するディレクトリへのパス、検索する属性を指定するオプション(大文字と小文字が区別されるファイル名の場合は-nameなど)、検索文字列が必要です。 デフォルトでは、検索文字列は文字通り扱われます。findコマンドは、正規表現構文を使用しない限り、引用符の間に入力した文字列と同じファイル名を検索します。

ドキュメントディレクトリに四つのファイルが含まれていると仮定します: Foo, foo, foobar.txt, とfoo.xml。 ここでは、”foo”という名前のファイルをリテラル検索します:

$ find ~ -name "foo"
/home/tux/Documents/examples/foo

-inameオプションを使用して大文字と小文字を区別しないようにすることで、検索を広げることができます:

$ find ~ -iname "foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo

ワイルドカード

基本的なシェルワイルドカード文字を使用して、検索を拡大できます。 たとえば、アスタリスク(*)は任意の数の文字を表します:

$ find ~ -iname "foo*"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

疑問符(?)は、単一の文字を表します:

$ find ~ -iname "foo*.???"
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

これは正規表現の構文ではないため、この例ではドット(.)はリテラルのドットを表します。

正規表現

正規表現を使用することもできます。 -iname-nameと同様に、大文字と小文字を区別するオプションと大文字と小文字を区別しないオプションの両方があります。 ただし、-nameおよび-inameオプションとは異なり、-regexおよび-iregex検索はファイル名だけでなくパス全体に適用されます。 つまり、fooを検索しても、foo/home/tux/Documents/fooと一致しないため、結果は得られません。 代わりに、パス全体を検索するか、文字列の先頭にワイルドカードシーケンスを使用する必要があります:

$ find ~ -iregex ".*foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo

先週に変更されたファイルを検索する

先週に変更されたファイルを検索するには、-mtimeオプションと過去の(負の)日数を使用します:

$ find ~ -mtime -7
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

日の範囲内で変更されたファイルを検索する

-mtimeオプションを組み合わせて、日の範囲内のファイルを検索することができます。 最初の-mtime引数には、ファイルを変更した可能性のある最新の日数を指定し、2番目の引数には最大の日数を指定します。 たとえば、この検索では、過去に1日以上の変更時間を持つファイルが検索されますが、7日以下の変更時間を持つファイルが検索されます。:

$ find ~ -mtime +1 -mtime -7

ファイルタイプで検索を制限する

探しているファイルタイプを指定してfindの結果を最適化するのが一般的です。 あなたが探しているものがわからない場合は、このオプションを使用するべきではありませんが、あなたはファイルではなく、ディレクトリ、またはディ オプションは-typeであり、その引数はいくつかの異なる種類のデータを表す文字コードです。 最も一般的なものは次のとおりです:

  • d – ディレクトリ
  • f – ファイル
  • l – シンボリックリンク
  • s – ソケット
  • p – 名前付きパイプ(FIFOに使用)
  • b – ブロックスペシャル(通常はハードドライブの指定)

ここにいくつかの例があります:

$ find ~ -type d -name "Doc*"
/home/tux/Documents
$ find ~ -type f -name "Doc*"
/home/tux/Downloads/10th-Doctor.gif
$ find /dev -type b -name "sda*"
/dev/sda
/dev/sda1

Adjust scope

findコマンドはデフォルトで再帰的であり、ディレクトリに含まれるディレクトリのディレクトリ(など)で結果を検索します。 これは大規模なファイルシステムで圧倒的になる可能性がありますが、-maxdepthオプションを使用して、findを下降させるフォルダ構造の深さを制御できます:

$ find /usr -iname "*xml" | wc -l
15588
$ find /usr -maxdepth 2 -iname "*xml" | wc -l
15

再帰の最小深さは、次のように交互に設定できます-mindepth:

$ find /usr -mindepth 8 -iname "*xml" | wc -l
9255

チートシートのダウンロード

この記事ではfindの基本的な機能のみをカバーしています。 それはあなたのシステムを検索するための素晴らしいツールですが、それはまた、強力な並列コマンドのための本当に便利なフロントエンドです。 findを学ぶには多くの理由がありますので、無料のfindチートシートをダウンロードして、コマンドの詳細を学ぶのに役立ちます。

Leave a Reply