出力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 ロケーションデータベースが最後に更新されたときに存在しました。
答え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.txt
b.txt
locate *.txt
locate a.txt b.txt
locate '*a.txt*' '*b.txt*'