findコマンドで正規表現を使用するにはどうすればよいですか?


297

生成されたuuid1文字列で名前が付けられた画像がいくつかあります。たとえば、81397018-b84a-11e0-9d2a-001b77dc0bed.jpgです。「検索」コマンドを使用してこれらすべての画像を検索したい:

find . -regex "[a-f0-9\-]\{36\}\.jpg".

しかし、それは機能しません。正規表現に問題がありますか?誰かがこれを手伝ってくれませんか?


7
多分正規表現を変更してください。デフォルトは、Emacs正規表現です。
パビウム2011

回答:


348
find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"

パス全体に一致する.*/ため、最初に指定する必要があることに注意してくださいfind

例:

susam@nifty:~/so$ find . -name "*.jpg"
./foo-111.jpg
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg

私のバージョンの検索:

$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0) 
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.jpg"
find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'.

4
@Tomは、検索の正規表現です。マニュアルページによると、正規表現はファイルパス全体、含まれるディレクトリと一致し"^ ... $"ます。つまり、正規表現は暗黙的に囲まれています。全体の結果行と一致する必要があります。
Manny D

2
0個以上の(ほぼ)任意の文字に一致/する.*/ため、in は必要ないと思います.*
ジェフ

2
初めて正規表現を適切に読み取らなかった(私など)の場合:特殊な正規表現文字の前にあるバックスラッシュに注意してください。例:\{36\}
Lucas Wilson-Richter

11
正規表現タイプの完全なリストを見つけるのに苦労しました(マンページが最新ではありません):valid types are 'findutils-default', 'awk', ' egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-egrep', 'posix -extended', 'posix-minimal-basic', 'sed'.
Noah Sussman '30

4
入れていることを確認してください-regextypeフラグをする前に-regexフラグ、それ以外の場合は適用されません!
Christopher Orr

84

-regex検索式が一致した名前全体カレントディレクトリからの相対パスを含むが、。以下の場合find .、この常にで始まる./、その後、任意のディレクトリを。

また、これらはemacs正規表現であり、通常のegrep正規表現以外のエスケープルールがあります。

これらがすべて現在のディレクトリに直接ある場合、

find . -regex '\./[a-f0-9\-]\{36\}\.jpg'

うまくいくはずです。(私は本当にわからない-私はここで仕事に数え繰り返しを取得することはできません。)あなたはegrepの式にで切り替えることができます-regextype posix-egrep

find . -regextype posix-egrep -regex '\./[a-f0-9\-]{36}\.jpg'

(ここで述べられていることはすべてGNU findであることに注意してください。MacのデフォルトでもあるBSDについては何も知りません。)


1
私の正規表現では、一致する複数の文字列に括弧があったので、posix-egrep型がうまくいきました。
palswim 2014年

2
注意すべきこと-regextypeは、findBSDではなく(少なくともMacのBSD風ではない)GNUのオプションですfind。このオプションが利用できない場合は、必ずGNU findをインストールしてください。Macの場合、brewパッケージで可能findutilsです。その後、検索はから利用できますgfind
DanCat 2016年

regextype posix-egrepが私のために仕事をしてくれました。デフォルトはregextype emacsだと思います。
infoclogged

35

他の答えから判断すると、これはfindのせいかもしれません。

ただし、代わりにこの方法で行うことができます。

find . * | grep -P "[a-f0-9\-]{36}\.jpg"

grepを少し調整し、必要に応じて異なるオプションを使用する必要があるかもしれませんが、機能します。


私にとってはうまく機能し、正規表現に関して大きな自由度を提供します。
glaucon 2014年

3
これの欠点は、特定のディレクトリをすべてスキップするfind-prune機能を利用できないことです。ほとんどの場合、これはそれほど重要ではありませんが、言及する価値があります。
アレクサンダーバード

-プルーンはまだ機能すると思います。-execを使用する方が危険です。grepが渡すことを許可したファイルだけでなく、すべてのファイルで実行されます。
tpb261

13

Mac OS X(BSD find)の場合:受け入れられた回答と同じ.*/ですが、完全なパスと一致させるにはプレフィックスが必要です。

$ find -E . -regex ".*/[a-f0-9\-]{36}.jpg"

man find-E拡張正規表現サポートを使用すると言います


Seems -EはUbuntuでは使用できません(WSL Ubuntuでテスト済み)
Warlike Chimpanzee

2
@Clever Little Monkey-いいえ、受け入れられた答えはUbuntuで動作するはずです。このバリエーションは、具体的にはMac OS X(またはおそらくFreeBSDのような別のBSDバリアント)向けです
Stan Kurdziel

8

シェルが文字列をエスケープしないように、単一引用符( ')を使用してください。式はパス全体に一致する必要があること、つまり次のようになる必要があることに注意してください。

 find . -regex '\./[a-f0-9-]*.jpg'

それとは別に、私の発見(GNU 4.4.2)は基本的な正規表現しか知らないようで、特に{36}構文は知らないようです。あなたはそれなしでやり遂げる必要があると思います。


8

簡単な方法-findはパス全体と一致するため、最初に。*を指定できます。

$ find . -regextype egrep -regex '.*[a-f0-9\-]{36}\.jpg$'

バージョンを見つける

$ find --version
find (GNU findutils) 4.6.0
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION 
FTS(FTS_CWDFD) CBO(level=2)

6

正規表現で検索命令を適用する場合は、絶対ディレクトリパスを使用する必要があります。あなたの例では、

find . -regex "[a-f0-9\-]\{36\}\.jpg"

に変更する必要があります

find . -regex "./[a-f0-9\-]\{36\}\.jpg"

ほとんどのLinuxシステムでは、正規表現の一部の分野はそのシステムでは認識できないため、次のように-regextyを明示的に指定する必要があります。

find . -regextype posix-extended -regex "[a-f0-9\-]\{36\}\.jpg"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.