出力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.txt
andが含まれている場合は、b.txt
最終的にItを実行します。実装に応じておよびまたはを含むパスをlocate a.txt b.txt
見つけます。a.txt
たとえば、パスは最初のカテゴリのパスのように見え、おそらく内部でコマンドを実行しています。b.txt
locate
/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 ロケーションデータベースが最後に更新されたときに存在しました。