如何检查目录中的所有文件是否都是有效的jpegs(Linux,需要sh脚本)?

Gra*_*raf 9 shell image-processing

好的,我有一个目录(例如,名为'/ photos'),其中有不同的目录(如'/ photos/wedding','/ photos/birthday','/ photos/graduation'等...)其中包含.jpg文件.不幸的是,一些jpeg文件被破坏了.我需要找到一种方法来确定哪些文件被破坏了.我发现,有一个名为imagemagic的工具,可以提供很多帮助.如果你这样使用它:

identify -format '%f' whatever.jpg
Run Code Online (Sandbox Code Playgroud)

它只在文件有效时打印文件的名称,如果不是,则打印出类似"识别:不是JPEG文件:以0x69 0x75开头`whatever.jpg'@ jpeg.c/EmitMessage/232.".因此,正确的解决方案应该是找到以".jpg"结尾的所有文件,将它们应用于"识别",如果结果只是文件的名称 - 不要做任何事情,如果结果与名称不同该文件 - 然后保存文件的名称(如文件"errors.txt").

任何想法我怎么可能这样做?

小智 13

一个问题identify -format是它实际上并没有验证文件没有损坏,它只是确保它真的是一个jpeg.

要实际测试它,你需要一些东西来转换它.但ImageMagick附带的转换似乎默默地忽略了jpeg中的非致命错误(例如被截断).

有一点可行的是:

djpeg -fast -grayscale -onepass file.jpg > /dev/null
Run Code Online (Sandbox Code Playgroud)

如果它返回错误代码,则该文件有问题.如果不是,那就好了.

还可以使用其他程序.

  • 这一点很重要。Alexx 的答案显示了另一个检查 JPG 文件的工具:“jpeginfo -c file”。 (2认同)
  • 以防万一,如果你需要检查文件夹中的所有jpg文件,请执行此操作 - `for f in*.jpg; do djpeg -fast -grayscale -onepass $ f>/dev/null; done` (2认同)

Ale*_*che 11

短期版本:

find . -iname "*.jpg" -exec jpeginfo -c {} \; | grep -E "WARNING|ERROR"

您可能不需要相同的查找选项,但jpeginfo是适用于我的解决方案:

find . -type f -iname "*.jpg" -o -iname "*.jpeg"| xargs jpeginfo -c | grep -E "WARNING|ERROR" | cut -d " " -f 1

作为脚本(根据此问题的要求)

#!/bin/sh
find . -type f \
\( -iname "*.jpg" \
 -o -iname "*.jpeg" \) \
-exec jpeginfo -c {} \; | \
grep -E "WARNING|ERROR" | \
cut -d " " -f 1
Run Code Online (Sandbox Code Playgroud)

我通过http://www.commandlinefu.com/commands/view/2352/find-corrupted-jpeg-image-files了解jpeginfo ,这解释了混合查找-o OR和-exec

  • 不幸的是,`identify`不会抱怨我有一些被截断的jpg文件,但是`jpeginfo -c`会抱怨,所以我建议`jpeginfo -c`。 (2认同)

Vil*_*ila 9

您可以将其放入bash脚本文件或直接运行:

find -name "*.jpg" -type f |xargs --no-run-if-empty identify -format '%f' 1>ok.txt 2>errors.txt

如果identify缺少,这里是如何在Ubuntu中安装它:sudo apt install imagemagick --no-install-recommended

  • 也可以写成`find -name'*.jpg'-exec identify -format"%f"{} \; 1> ok.t​​xt 2> errors.txt`. (4认同)
  • 将其标记为已接受,但最终脚本为:find -name'*.jpg'-exec identify -format"%f \n"{} \; 2> errors.txt这可能正是我需要的,测试数据和errors.txt测试给我所有必要的信息(ok.txt对我没有好处,所以我从脚本中删除它).谢谢所有参与者! (2认同)