zsh大文字と小文字を区別しないワイルドカード

zsh大文字と小文字を区別しないワイルドカード

コンテキスト: macOS Catalina(zsh)

このスクリプトは、すべてのJPEGファイルを処理するために使用されます。このスクリプトは.JPGファイルを処理しませんが、.jpgファイルは処理します。

top=/Users/user/Desktop/
for file in $top/**/*.jp*g(NDn.); do      #selects filetypes: .jpg .jpeg 
  mogrify -auto-orient \
          -gravity northWest \
          -font "Arial-Bold-Italic" \
          -pointsize 175 \
          -fill red \
          -annotate +30+30 $n \
          -- $file &&
  echo  $file "was watermarked with" $n | tee -a forLooplog.txt
  (( n++ ))
done

大文字と小文字を区別せずに.JPG .JPEGファイルをキャプチャするように2行目を変更するにはどうすればよいですか?

ベストアンサー1

特にあなたの場合、globはです$top/**/*.jpgいいえcaseglobグローバルモードのすべてのパスコンポーネントに影響を与えるため、このオプションをグローバルにオフにします(オンとnocaseglob同じ)。

$ top=a zsh +o caseglob -c 'print -rC1 --  $top/*.jpg'
a/foo.jpg
a/foo.JPG
a/FOO.jpg
a/FOO.JPG
A/foo.jpg
A/foo.JPG
A/FOO.jpg
A/FOO.JPG

jpg()と関連のないディレクトリ()で、同じ名前が大文字であるすべてのファイルを見つける方法を確認してください。そのようなディレクトリがなくても、zsh はそのディレクトリを探し続けます。つまり、グローバル拡張コストをより高価にするコンポーネントを形成する各ディレクトリの内容をリストする必要があります。JPG$topaA$top

IMO、nocaseglobこのオプションは忘れておくことをお勧めします。これは単に²との互換性のためにzshに追加されておりbash、大文字と小文字を区別しないファイルシステムAPIを持つCygwin / macosなどのシステムユーザーの生活をより簡単にするために追加された可能性があります。

(#i)代わりにglob演算子(with)を使用しましたextendedglob。ここで、globのどの部分が大文字と小文字を区別する必要があるかを指定できます(~(i)ksh93に似ています)。

set -o extendedglob # needed for (#i)
for file in $top/**/*.(#i)jp(e|)g(NDn.); do

またはこれを行うこともできます:

for file in $top/**/*.[jJ][pP]([eE]|)[gG](NDn.); do

sh大文字と小文字を区別しないグローバル演算子を持たない他のシェルと同じです。

また、代わりに*.jp(|e)gファイル*.jp*g名と一致します。my.jpeg.import.log


¹、、、、、CASEGLOB大文字と小文字はCASE_GLOBC_A_se_G_lobオプション名では無視されます。オプションのサポートをオフにすることは、noPOSIX shオプション(およびzsh自体を含む他のシェル)を使用して混乱に対応する試みです。これらのいくつかはnoプレフィックスが付いており、一部はプレフィックスが付いていません。

²bashは異なる動作をしますが(私の考えでは、少なくともファイル名から大文字と小文字を区別するシステムでは良いです)、この場合/ファイルのみがa/*.jpg見つかります。大文字と小文字を区別しないからではありません。jpgJPGaAパスコンポーネント実際にはglob演算子があります(/file[a]/*.jpgにもありますjpg)。JPGA

おすすめ記事