特定のディレクトリの下にある「locate」を使用しますか?


46

「locate」の検索範囲を特定のディレクトリに制限する方法を知りたいのですが?

たとえば、「/ home / tim / science /」ディレクトリの下の名前に文字列「math」を含むファイル/ディレクトリを見つける方法

よろしくお願いします!

回答:


30

UPDATE:Locateの正規表現オプションの使用に関する注意事項とLocateの引数に関連するシェルのファイル名展開 ...

SHELL FILENAME EXPANSION
入力するとlocate /bin/b*(引用符がないことに注意してください)、いくつかのことが起こります。

  1. まず、シェルのファイル名展開は、特殊なシェルパターン文字 * を展開します(これは、*が保護されていないためです。つまり、「二重引用符」がないためです)。
  2. この結果の展開は、ファイル名のリストです。これはおそらく非常に長い...このリストはlocate、多くの個々のコマンドライン引数に渡されます。
  3. locate 次に、これらの各引数をデータベース内の各ファイルに対してテストし、一致を出力します。

ただし、「locate」には現在の作業ディレクトリの概念がないことに注意してください。データベース内の完全修飾ファイル名に対してのみ引数を照合します。
このことは、両方が一致することを意味/bin/bash し、 /home/user/bin/brackets
あなたがある程度の制御をこのように持っているが、の見つけ正規表現検索より申し出が。Locateのその他のオプションも同様です。

LOCATEの正規表現オプション単純な引数を使用した場合とは異なること
を入力するlocate -r "/bin/b.*"と、。(shell-expanded-args は単純な引数のリストにすぎません)

  1. -rオプションは伝え見つけ正規表現のパターンとして、あなたの引数を処理すること。
  2. 引用符は、シェルのファイル名展開から*を保護します。*とドットを意味します。今ある特殊な正規表現文字は、
  3. 正規表現であるため、さまざまな方法でデータベースエントリと一致するように「locate」を非常に簡単に伝えることができます。/ bin / b ... eg2でlocate -r "^/bin/b.*"始まるファイル名を生成します。始まるファイル名生成/ホーム/ユーザー/ binに/ Bを〜/であることに注意してください... ない「引用マーク」によって保護され、したがって、対象となるシェルチルダ拡張変換〜/に/ホーム/ユーザー/ locate -r ~/"bin/b.*"

要約:「shell filname expansion」は「regex」とはまったく異なります

元の投稿に戻ります。


locate 通常、データベース全体を標準出力にリストするため、フィルタリングする必要がある特定のディレクトリに限定するには... Locateのオプションを使用してこれを行うことができます。

単なるシェルグロビングではなく、locateの正規表現機能を使用できます...(locate /dir/myfile* シェルグロビングです)...

情報から:-r--regex

  • "...(正規表現)マッチ​​はパス名全体に対して実行されるため、デフォルトでは、パス名の一部が指定された正規表現と一致する場合、パス名が一致します。正規表現は^または$を使用して、パス名の始まりまたは終わり。」

注:-i = caseを無視し
ます。。。。。-r =正規表現
。。。。。〜/は、シェルによって/ home / userに展開されます(〜/が引用符で囲まれていない場合)
。。。。。'\'(バックスラッシュ+スペース、引用符なし)はリテラルのスペースです(シェルの展開を避けるため)。文字列を引用符で囲むことができますが、引用符の外側に〜/を残すようにしてください:~/my\ regexまたは-/"my regex"

例えば。locate -ir ~/".*"la\ bella\ vitaは、locate -ir ~/".*la bella vita"ホームディレクトリ全体を検索し、どこでも発生する「La Bella Vita」を探します。

検索をファイルだけに制限することもできますが、-bまたは--basename.. を使用します。この場合、正規表現の行の開始^はベース名のみに適用されます...

私は最もよく自分が locate -bir

PS .. Locateは非常に高速であるため、使用したことがありませんfind ...ノーチラス検索を使用していません(遅すぎる)

「locate」を使用して、新しく追加されたものを探している場合は、単にsudo updatedblocateのデータベースを更新するために実行してください...


13

次のようにgrepにパイプします

$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless

編集:他の答えは良いです、私はあなたが見つけるためにパターンを渡すことができるとは知りませんでした。


@Adam ..メソッドを過小評価しないでください。それは大丈夫ですが、grepにパイプする代わりに、locateの正規表現を使用できます。あなたが参照する「他の」メソッドは正規表現を使用せず、まったく異なる動作をします。答え
...-Peter.O

2
以下を見つける| grep ^ / binは、locate -r ^ / bin /.* lessよりもはるかに高速です。locatelessは単語lessの効率的な検索を実行し、locate -rはlocatedbのすべてのエントリに対して正規表現操作を実行するためです
Marcel Valdezオロスコ

@MarcelValdezOrozco「単語の効率的な検索」とは何ですか。なぜ正規表現よりも高速ですか?
Flashrunner

ので@FlashrunnerはlocateありませんO(log(n))以上の検索locatedbあなたはそれを非正規表現の検索クエリを与えるときに、あなたが使用することができますgrep実行するための正規表現をO(m)すでに減少し、サブの結果を検索します。(n = locatedb[すべてのドライブのファイル]のエントリの総数、m =で一致するエントリの数locatedb)、合計実行複雑度:O(log(n)) + O(m)ここで、mは平均log(n)であるため2*O(log(n))O(n)実行時とは対照的に、のすべてのエントリに対する正規表現クエリlocatedb
マルセルバルデスオロスコ

@MarcelValdezOrozcoしかし、なぜdb上での非O(log(n))正規表現検索はO(n)なぜ正規表現検索なのか?dbのエントリの量はそれぞれ同じです。検索アルゴリズムですか?
Flashrunner

8

locate /rootpath/*filenamespec.I を使用したことがありますが、使用できますが、動作するようです。あなたの例を行うには、それはlocate /home/tim/science/*math*

そのような動作findではなく、コマンドを確認することをお勧めしますlocate。構文はになりますfind rootforsearch -name filenamepattern -print。この場合、あなたの例では、find /home/tim/science -name *math* -print検索するデータベースがないので、locateほど高速ではありません...実際にファイルシステムを検索します。実際にファイルを処理する場合は、印刷以外にも使用できる多くのオプションがあります。


これは、locate(などの他のユーティリティを必要grepとしない)それ自体を使用し、正規表現なしで実行するため、最良の回答です(この場合は便利ですが、不要です)。
トム

これは本当に特定のディレクトリパスでファイルを検索するためにロケートを使用できるチャームのように機能します。ありがとう@Nerdfest
amit_game

1

私にとって最も便利なのは

cd /home/tim/science
locate math | grep `pwd`

あなたは本当に質問を読みましたか?
Tessaracter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.