「locate」と一致する正規表現


8

Locateコマンドを使用してホームフォルダー内のファイルを検索しようとしていますが、これを実行しようとすると、結果が得られません。

locate -i -l 4 --regexp '^\/home\/jack\/[A-Za-z0-9\/\ ]*(My.)*$'

私も試しました^\/home\/jack\/^(?!\.)[A-Za-z0-9\/\ ]*(My.)*$が、結果も返されません。

それをテストするためだけに私が探しているファイルは /home/jack/Music/Foals/My Number.flac

非表示のファイルの結果を検索から除外したいと思います。


2
私はよく知りませんlocate。の-bパスと組み合わせる(つまり、「指定されたパターンに対してベース名のみを照合する」)ことは意味があります--regexpか?なぜあなたはエスケープする/のですか?
Hauke Laging 2014

申し訳ありませんが、これらの文字をエスケープするようにアドバイスする正規表現ビルダーを使用していました。-bフラグについては正しいと思います。今すぐそれを取り除きます
Jack Jones

1
何をする(My.)*ことになっていますか?My.*$動作します。()基本的なREでエスケープする必要があります。
Hauke Laging

1
拡張正規表現を使用しています。しかし--regexp、基本的な正規表現を取ります。(いいえ)に変更--regexpしてみてください。manページには、拡張正規表現マッチングを行うと書かれています。--regexp--regex
ミケル2014

回答:


6

これでうまくいくようです。

locate -ir '^/home/jack/\([^.][^/]\+/\)\+My[^/]*$'

マニュアルからの引用:

-i、--ignore-caseパターンを照合するときに大文字と小文字の区別を無視します。

-r、--regexp REGEXP基本的な正規表現REGEXPを検索します。このオプションを使用する場合、PATTERNは許可されませんが、このオプションは複数回指定できます。


Linuxでは、mlocate 0.26-1ubuntu2(Ubuntu 16.04 LTS Xenial Xerus、2018-02-05現在)のコマンドは、「locate:非オプション引数は--regexpでは許可されていません」というエラーを返します。mlocateは実際のパッケージです(/ usr / bin / locateはmlocateへのシンボリックリンクです)。
Hans Deragon、2018

1

検索の仕組み

locateコマンドが使用するファイルのインデックスは、通常、1日に1回だけ再構築されます。これは、このcronジョブによって構築され/etc/cron.daily/mlocateます。そのため、あなたのエントリはまだまだ存在しない可能性があります。これらのインデックスを手動で再構築する場合は、再実行できます。

$ sudo /etc/cron.daily/mlocate

検索を使用する

ただしfind、ホームディレクトリでファイルを見つけるなどのコマンドを使用する方がよいでしょう。

$ find ~ -iname "[^.]*" | head -10
/home/saml
/home/saml/isql_issue.txt
/home/saml/bbbb
/home/saml/script_name.sh
/home/saml/go_figure_book
/home/saml/go_figure_book/readme.txt
/home/saml/go_figure_book/lstopo.txt
/home/saml/go_figure_book/who_breaks_out.bash
/home/saml/hdat2
/home/saml/hdat2/hdat2_v50.iso

GUIの使用

グラフィカル検索ツールにも興味があるかもしれません。Catfishと呼ばれるそのようなツールの1つをカバーする、ロケート用のGTKフロントエンドの別のU&L Q&Aを見てください。このツールは、locateデータだけでなくfindコマンドも利用できます。


1
私は最初にやらなければならない場合locateよりfindも速く見つけることがよくありますupdatedb。ほとんどのシステムでデータベースがすでに適切に更新されているupdatedb限り、それほど長くはかかりません。この場合でも、構文の検索はおそらく簡単です。
Graeme 14

ええ、私も毎日使用していましたfind。これは、私が頻繁に切り替えるものをスクリプト化しているサーバー上でのみです。
slm

うん、「ほとんどのデスクトップ・システム」を入れている必要があります
グレアム・

1

別のアプローチを取ることもできます。

locate "My file" | grep '/home/jack' | grep -v '/\.'

何をしようとしているのかわかりません。あなたは、使用している-iすべてのファイルやフォルダの下にある見つけるために、上部になりたいと思える、それは大文字と小文字を区別するためにフラグをし、あなたの正規表現は非常に具体的ではありません/home/jack含まれているとMYMymy、またはmYファイル名にどこでも。もしそうなら、ただ走る

locate -i my | grep '/home/jack' | grep -v '/\.'

0

これは動作するはずです-非表示になっていないファイルとフォルダのみに一致します:

find /home/jack -name "[^.]*My.*"

さらに簡単-これは、ディレクトリツリーのどこにも隠しディレクトリがないファイルと一致します。おそらくこれはあなたが望むものです:

for f in /home/jack/**/*My.*
    do echo "$f" # or do any other command
done

入力時locateに検索するためにPython GUIに統合しようとしているため、より高速です。どっちにしても、ありがとうね!
ジャックジョーンズ

@JackJonesならlocate、結果を高速化する必要さえありません。例:echo /home/jack/**/*My.*
jayhendren 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.