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 ロケーションデータベースが最後に更新されたときに存在しました。

おすすめ記事