web-dev-qa-db-ja.com

コマンドでregexを使うには?

生成されたuuid1文字列で名前が付けられた画像がいくつかあります。例えば81397018-b84a-11e0-9d2a-001b77dc0bed.jpgです。 "find"コマンドを使って、これらすべての画像を見つけたい。

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

しかし、うまくいきません。正規表現に問題がありますか?誰かがこれを手伝ってくれる?

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

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

例:

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

私のバージョンのfind:

$ 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) 
[email protected]:~/so$ 
[email protected]:~/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'.
289
Susam Pal

-regex find式は、現在のディレクトリからの相対パスを含めて、完全名と一致します。 find .の場合、これは常に./で始まり、次に任意のディレクトリで始まります。

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

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

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

うまくいくはずです。 (よくわかりません - ここで繰り返しカウントを実行することはできません。)-regextype posix-egrepでegrep式に切り替えることができます。

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

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

69
Paŭlo Ebermann

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

しかし、代わりにこれを行うことができます。

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

Grepを少し微調整して、必要に応じてさまざまなオプションを使用する必要があるかもしれませんが、うまくいきます。

27
yarian

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

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

それとは別に、私のfind(GNU 4.4.2)は基本的な正規表現しか知らない、特に{36}構文は知らないようです。あなたはそれなしでやらなければならないと思います。

7
thiton

簡単な方法 - 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)
7
binbjz

正規表現でfind命令を適用するときは絶対ディレクトリパスを使うべきです。あなたの例では、

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"
6
Lovely

Mac OS Xで(BSD find):一般的な回答と同じですが、完全パスを一致させるには.*/プレフィックスが必要です。

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

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

3
Stan Kurdziel