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)
如果它返回错误代码,则该文件有问题.如果不是,那就好了.
还可以使用其他程序.
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
您可以将其放入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