whileループ内の正規表現または同様のbashフィルタファイル名

whileループ内の正規表現または同様のbashフィルタファイル名

現在ディレクトリにあるすべてのファイルの幅と高さを取得する次のbashスクリプトがあります。

ls | cat -n | while read n f; do 
  width=$(identify -format "%w" "$f")
  height=$(identify -format "%h" "$f")
  echo "$width , $height"
done

ファイル名で終わるファイルの高さ/幅を取得するには-example99.jpg

答え1

for filename in *-example99.jpg
do
  width=$(identify -format "%w" "$filename")
  height=$(identify -format "%h" "$filename")
done

答え2

ここではループは必要ありません。

identify -format "%w , %h\n" ./*-example99.jpg

%fファイル名も必要に応じてフォーマットに追加してください。)

ファイルごとに2つのコマンドを実行したくない場合は、identify次のようにすることもできます(ここksh93または構文を使用)。bash

unset -v file width height
file=(./*-example99.jpg)
eval "$(identify -format 'width+=(%w) height+=(%h)\n' "${file[@]}")"

for ((i = 0; i < ${#file[@]}; i++)); do
  printf 'File: %s (%s x %s)\n' "${file[i]}" "${width[i]}" "${height[i]}"
done

(または配列のキーをfor i in "${!file[@]}"; do...繰り返します)。$file

これは、すべてのファイルの幅と高さが認識されると仮定し、複数の画像(アニメーションなど)を含むことができるファイル形式にはこの方法を使用しidentifyません。gif

答え3

シンプルfind+identify方法:

find . -maxdepth 1 -type f -name "*-example99.jpg" -exec identify -format "%w, %h\n" {} \;

出力例:

640, 480

関連情報