bash 在 while 循环中通过正则表达式或类似过滤文件名

bash 在 while 循环中通过正则表达式或类似过滤文件名

目前我有以下 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如果您还需要文件名,请添加到格式中)。

为了避免identify每个文件运行 2 个命令,您还可以执行以下操作(此处使用ksh93orbash语法):

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

相关内容