
さまざまな画像ファイル名のバリエーションを含むフォルダーを検索しようとしています:
1_2-300x224.jpg
1_2-600x449.jpg
1_2-600x600.jpg
1_2-768x575.jpg
1_2-802x600.jpg
1_2.jpg
計画は、2〜4桁の数字+「x」+2〜4桁の数字で終わるファイルを見つけて削除することです。この一致は正規表現式を使用します.*(\d{2,4}x\d{2,4}).jpg
(この式は を除くすべてを強調表示します1_2.jpg
)。
ただし、実行してもfind . -name ".*(\d{2,4}x\d{2,4}).jpg"
結果は返されません。
困惑してしまいました!
答え1
ここで問題がいくつかあります。まず、John が述べたように、-name
はグロブによる部分文字列マッチングを行うため、 を使用する必要があります-regex
。次に、正規表現方言の非互換性があります。デフォルトでは、GNU find は Emacs 正規表現を使用し、BSD find は posix 基本正規表現を使用します。find.info
インストールしている場合は、こちらで詳細を読むことができます。
info find.info 'Reference' 'Regular Expressions' 'emacs regular expression'
サポートされている正規表現の方言については、以下を参照してください。
info find.info 'Reference' 'Regular Expressions'
ここ:
* findutils-default regular expression syntax::
* emacs regular expression syntax::
* gnu-awk regular expression syntax::
* grep regular expression syntax::
* posix-awk regular expression syntax::
* awk regular expression syntax::
* posix-basic regular expression syntax::
* posix-egrep regular expression syntax::
* egrep regular expression syntax::
* posix-extended regular expression syntax::
GNU検索
posix-extended
GNU find を使用すると、次のように式を機能させることができます。
find . -regextype posix-extended -regex '.*[0-9]{2,4}x[0-9]{2,4}.jpg'
出力:
./1_2-600x600.jpg
./1_2-802x600.jpg
./1_2-600x449.jpg
./1_2-300x224.jpg
./1_2-768x575.jpg
BSD検索
BSD find にアクセスできませんが、これは機能するはずです:
find -E . -regex '.*[0-9]{2,4}x[0-9]{2,4}\.jpg'