txt検索と* .txt検索の違いは何ですか?

txt検索と* .txt検索の違いは何ですか?

出力locate txt | head

/etc/brltty/brl-ba-all.txt
/etc/brltty/brl-bd-all.txt
/etc/brltty/brl-bl-18.txt
/etc/brltty/brl-bl-40_m20_m40.txt
/etc/brltty/brl-ec-all.txt
/etc/brltty/brl-ec-spanish.txt
/etc/brltty/brl-eu-all.txt
/etc/brltty/brl-lb-all.txt
/etc/brltty/brl-lt-all.txt
/etc/brltty/brl-mb-all.txt

出力locate *.txt | head

/home/abc/capital.txt
/home/abc/state.txt

出力になぜこんなに大きな違いがあるのでしょうか? 2番目のコマンドは私のホームフォルダだけをチェックするようですが、最初のコマンドは多くのディレクトリをチェックするようです。なぜこれが起こるのですか?

答え1

locate txtパスに1を含むすべてのファイル(通常のファイル、シンボリックリンク、ディレクトリ、ソケットなどを含むすべての種類)を見つけます。txtしたがって、などが含まれます/foo/xtxty/bar/foo/bar.txt/foo/txt.bar

locate *.txt*は引用されていないため、間違っているため、*.txtシェルは最初にパターンに一致する現在のディレクトリのすべてのファイル名に展開し、結果をに渡しますlocate。たとえば、現在のディレクトリにa.txtandが含まれている場合は、b.txt最終的にItを実行します。実装に応じておよびまたはを含むパスをlocate a.txt b.txt見つけます。a.txtたとえば、パスは最初のカテゴリのパスのように見え、おそらく内部でコマンドを実行しています。b.txtlocate/foo/da.txtob.txt/home/abc

現在のディレクトリにファイルがない場合、.txtシェルによってエラーが発生するか、リテラル引数locateとして呼び出されます。*.txt

常にlocate目的のリテラルで呼び出すには、シェルに対してそのリテラルを引用する*.txt必要があります。 Bourneのようなシェルまたはバックスラッシュを使用している場合は、Bourneのすべての内容を引用するため、一重引用符が最適です。文字はシェルです。次のシェルは最も移植性に優れています。*"..."'...'

locate '*.txt'

次に、引数にワイルドカード(*)が含まれているため、部分文字locate列検索からパターン一致検索(find -nameシェルまたは他の認識された検索と同じ)に切り替え、パターンと一致するすべてのファイルパス、つまり、またはパス.txtで返します。 。/foo/.txt/foo/bar.txt

locate標準コマンドではなく、互換性のない実装がたくさんありますが、上記の単純な動作はすべてではなくても、ほとんどの場合共通です。ほとんどの実装は、さまざまな一致のさまざまなオプションをサポートしています。さまざまな実装やバージョンが非常によく文書化されている可能性があるため、インターネット上の任意のページではなく自分のlocate文書を確認してください。man locate


1 ロケーションデータベースが最後に更新されたときに存在しました。

答え2

<command> *.txtたとえば、()などのワイルドカードを使用すると、実行中のコマンドではなくシェルで拡張が実行されます。この場合はそうですlocate

実行中のコマンドにワイルドカード文字を渡すには、その文字を引用符で囲みます。

locate "*.txt"

または、次のようにエスケープします\

locate \*.txt

また、locate正規表現をある程度ベースとする一致アルゴリズムがありますが、完全ではありません。を検索すると、必ずしも最後にある必要はありませんが、ファイル名の一部として含めたいとtxtします。txt

あなたできる強制正規表現処理:

locate -r "txt$"

詳細については、次を参照してください。locateマニュアルページ

答え3

locate必要模様パラメータとして。引用されていないので、*.txtシェルはそのまま渡すのではなく、最初に拡張しようとします。

また、次の点に注意してください。

特別な場合には、ワイルドカード文字(「foo」)を含まないパターンは「*foo*」のように一致します。

したがって、現在のディレクトリにandだけが含まれていると仮定すると、拡張されるので同じlocate txtです。locate '*txt*'a.txtb.txtlocate *.txtlocate a.txt b.txtlocate '*a.txt*' '*b.txt*'

関連情報