linux find regex-一致の代わりに「検索」を使用できますか?


0

このfindユーティリティは強力ですが、いくつかの追加機能が必要です。

その-regex検索では、各ファイル名(またはdirname)を文字列として扱い、指定された正規表現を名前の先頭にのみ適用します。pythonのようなre.match(..)。一致しない場合、検出されません。

たとえば、「ログ」を含むファイルを検索する場合(ファイル名に正規表現なしの「ログ」が含まれるファイルを検索する簡単な方法があることは知っていますが、これは単なる例です)

$ find -regex 'log'
(nothing)

$ find -regex '\./.*log.*$'
./log9
./log7
./log5
./log0
./log2
./log4
./log6
./log8
./log3
./log1

そう、作る方法があるfindとの-regexことで、ファイル名、等に正規表現を使用していますgrepか、Pythonのre.search(..)文字列の先頭にいないだけで、それが一致することができますどこにでもどこに- ?

回答:


0

正規表現は先頭に適用されるだけでなく、文字列全体に適用されます。ファイル名全体をキャプチャする正しい正規表現を指定する必要があります。

$ ls -l
total 0
-rw-r--r-- 1 terdon terdon 0 Oct  6 15:46 aaafoo
-rw-r--r-- 1 terdon terdon 0 Oct  6 15:46 aaafooaaa
-rw-r--r-- 1 terdon terdon 0 Oct  6 15:46 fooaaa
$ find . -regex ".*foo.*"  
./aaafoo
./aaafooaaa
./fooaaa
$ find . -regex "^./foo.*"  
./fooaaa
$ find . -regex ".*foo"
./aaafoo

-name正規表現ではなく、グロブを取るテストを探しているかもしれません。

$ find  . -name "*foo*" 
./aaafoo
./aaafooaaa
./fooaaa

おかげで、しかし、あなたの例では明らかに、すべての正規表現はほんの始まりに適用されていることを示し(それが理由で、試合を生成.*あるいは^./regexsのみ文字列の先頭に試されていない場合は不要だろう正規表現の開始時に。 )-nameはグロブ専用です..なので、唯一の解決策は、より長い正規表現を書くことです。
thkang

1
@thkangが言っているのは、正規表現が文字列全体を最初から最後まで記述する必要があるということです。それは、全体と一致する最初と一致するだけではありません。そのように記述できないファイル名はありません。を追加するだけ.*で、文字列内の任意の場所に一致させることができます。正規表現を記述できなかったファイル名の例は考えられません。
テルドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.