【问题标题】:How to recursively list the dimensions of all images in a folder recursively using Shell script?如何使用Shell脚本递归地列出文件夹中所有图像的尺寸?
【发布时间】:2014-11-04 11:38:49
【问题描述】:

我认为标题应该清楚地说明我要做什么。我对 shell 脚本非常陌生,并且已经设法将一些代码放在一起,但它根本不对 - 我计算机上的每个文件都被列出

理想情况下,我还想检查所有图像类型(至少 jpg、png 和 gif)

find "$1" -name ".jpg" | while read imagePath ; do
imageFile=$(basename "$imagePath")
dimensions=$(sips -g pixelHeight -g pixelWidth * )
echo "$videoFile: $dimensions" done

有人可以帮忙吗? 谢谢!

【问题讨论】:

  • 你得到什么错误?您不使用 imageFile,这很好,因为对 basename 的调用是不必要的,并且您在 done 之前缺少一个 ;。否则,它在语法上看起来不错。
  • 感谢威廉的快速回复,我没有收到错误消息,我需要过滤掉非图像文件。将更新我的问题,对不起!

标签: image shell recursion terminal dimensions


【解决方案1】:

这应该很适合你:

#!/bin/bash

find . \( -iname "*.jpg" -o -iname "*.png" -o -iname "*.gif" \) -print0 | \
   while read -d $'\0' -r image; do
      read w h < <(sips -g pixelWidth -g pixelHeight "$image" | \
         awk '/Width:/{w=$2} /Height:/{h=$2} END{print w " " h}')
      echo $image $w $h 
   done

样本输出

./start2.png 640 480
./step2.gif 1 3918
./step2.jpg 1 3918
./step3.gif 2551 1
./survey.gif 2651 4018
./t.jpg 1 463
./tiger.png 258 296

将以上内容保存在名为pics 的文件中,然后转到终端并键入以下内容以使其可执行:

chmod +x pics

然后,当你想运行它时,只需输入:

./pics

不过,就个人而言,我更喜欢 ImageMagick 而不是 SIPS,因为您可以在一行中执行类似的操作:

identify -format "%f: %wx%h\n" *.jpg *.gif *.png

样本输出

7T6Dj.jpg: 1920x1080
a.jpg: 400x463
b.jpg: 400x463
back.jpg: 906x603
background.jpg: 906x603

如果您想在 Mac 上安装 ImageMagick,请使用 homebrew,这很容易。

更新答案

如果您只想输出每个图像大小一次,忽略第二个和后续尺寸相同的图像,您可以在末尾添加一些awk,如下所示:

#!/bin/bash

# Find all types of imagery GIF, JPG, PNG
find . \( -iname "*.jpg" -o -iname "*.png" -o -iname "*.gif" \) -print0 | \
   while read -d $'\0' -r image; do
      read w h < <(sips -g pixelWidth -g pixelHeight "$image" | \
         awk '/Width:/{w=$2} /Height:/{h=$2} END{print w " " h}')
      echo $image $w $h 
   done | awk '{w=$(NF-1); h=$(NF); if(!seen[w SUBSEP h]++)print $0}'

【讨论】:

  • 嗨,这很好,虽然我遇到了一个错误,看起来像是一个错字:image_dimensions.sh: line 5: syntax error near unexpected token `
  • 不,是bash。保存在一个名为 pics 或类似名称的文件中,然后在终端中,键入 chmod +x pics 一次以使其可执行,然后执行此操作以运行它:./pics
  • 效果很好!非常感谢。还有一个问题 - 我怎么能只在每次出现以前未列出的尺寸的图像时才回显?
  • 不确定我是否理解。它只会对您拥有的每个图像执行一次,因此不会多次列出任何文件。
  • 我试了一下我认为你的意思 - 请看看我答案的底部。
【解决方案2】:

我找不到sips,所以根据上面的答案,这条单线对我有用:

$ identify -format "%f: %wx%h\n" *.jpg *.gif *.png | cut -d: -f2 | sort -u | sed 's/x/\t/g'

这会输出当前目录中以制表符分隔的文件大小的宽度、高度列表(我试图查看我的目录中有多少不同大小的图像)

 909    503
 924    503

备注

示例输出,第一部分:

jobs8.png: 909x503
jobs.png: 909x503
lobstr.png: 924x503

第二部分,删掉文件名:

 909x503
 909x503
 924x503

删除重复项:

 909x503
 924x503

用标签美化:

 909    503
 924    503

【讨论】:

  • sips 是 Mac OS 中包含的二进制文件,所以如果你不是在 Mac 上,我不相信你可以使用它。
【解决方案3】:

如果您安装了 ImageMagick,您可以将其“identify”命令与“find”结合使用。

以下oneliner将为您提供底层目录中所有jpg图像的递归列表:

find . -name "*.jpg" -exec identify {} \;

【讨论】:

    猜你喜欢
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多