名前グローバルパターンまたは正規表現でファイルを探します。ただし、最初は正確に一致し、最後では特定の文字のみを受け入れます。

名前グローバルパターンまたは正規表現でファイルを探します。ただし、最初は正確に一致し、最後では特定の文字のみを受け入れます。

find . -name 'Name*'デフォルト名を共有しますが、ファイルと一致するように最後にサイズ情報が追加されたいくつかの画像ファイルを一致させようとします。たとえば、次のようになります。

Name.jpg
[email protected]
Name-180x101.jpg
[email protected]

しかし、私のグローバルパターンも一致します。

NameLonger.jpg
[email protected]
NameLonger-180x101.jpg
[email protected]

2番目のグループは人気がありません。

find最初のグループを攻撃し、2番目のグループを無視するようにコマンドをどのように調整できますか?グローバルパターンを使用できますか、それとも正規表現が必要ですか?

注:この場合、サイズ情報(-180x101)は常に「-」、ランダムな数字、「x」、ランダムな数字の順です。ファイルに「@2x」が含まれている場合は、常に最後にあります。

注:一般ファイル(例:Name.jpg

よろしくお願いします。

ベストアンサー1

を使用して、zsh必要なファイル名の形式を指定します。

print -rC1 -- **/Name(-<->x<->|)(@<->x|).jpg(DN)
  • print -rC1print rあ、1 Cコラムについて
  • **/:再帰的ワイルドカード
  • (a|b)(x|)EREのように交互に(x)?
  • <x-y>:整数xからyまでの一連の10進数を表し、<->任意の数字の一連の数字を表します。
  • D::dotglobこのように隠されたディレクトリも見ることができますfind
  • N::nullglob一致するものがない場合は、文句を言わず、何もないものに拡張してください。

GNUfind同等(ファイル順序がなく、./各パスにプレフィックスが付いています):

LC_ALL=C find . -regextype posix-extended -regex \
  '.*/Name(-[0-9]+x[0-9]+)?(@[0-9]+x)?\.jpg'

(BSDの場合は代わりにfind使用)find -E .find . -regextype posix-extended

標準を使用すると、findおそらく次のようになります。

find . -name '.*/Name[-@.]*'

必要なのは排除だけならそれで十分ですNameLonger

単純ワイルドカードパターンには、OR+演算子に対応するパターンはありません?|複数の-nameAND を! -name使用して AND と OR で同じ操作を実行できますが(たとえば、受け入れますがName-*x*.jpg 拒否、Name-*[!0-9]*x*[!0-9]*.jpgなど)、すべてのケースを処理するには何百回も必要なので、非常に面倒です。Name-x*Name-*x.jpg

fnmatch()この関数 ( で使用 ) の GNU libc 実装は、正規表現同等性をもたらすいくつかのfind -nameksh88 拡張 glob 演算子 (フラグ) をサポートするように指示できます ( 、 ... また or でもサポートされています )。しかし、私が知っている限り、GNU実装ではそれを使用するように指示することもできます。FNM_EXTMATCH+(...)?(...)zsh -o kshglobbash -O extglobfind

POSIXlyでは、以下を使用して一致を最適化できますawk

LC_ALL=C find . -name 'Name*' -exec awk '
  BEGIN {
    for (i = 1; i < ARGC; i++)
      if (ARGV[i] ~ "/Name(-[0-9]+x[0-9]+)?(@[0-9]+x)?\\.jpg$")
        print ARGV[i]
  }' {} +

(一部のファイルのパスが長すぎてコマンドラインに収まらないと失敗する可能性があることに注意してください。とにかく、すべてのfind実装がそれより長いパスを持つファイルを見つけることはできませんPATH_MAX。)

おすすめ記事