根据分辨率在 Linux 目录中查找图像

根据分辨率在 Linux 目录中查找图像

我想扫描目录中的所有图像(在子文件夹中递归扫描),并找到分辨率高于特定阈值的图像(例如,至少具有分辨率的图像,800x600或者更简单的说法是宽度高于1000像素的图像)。然后我想将它们的地址记录在文本文件中,并附上它们的分辨率(或[width], [height]更好的格式)。

因此log.txt看起来像这样:

/home/users/myuser/test/image1.jpg, 1800, 1600
/home/users/myuser/test/image20.jpg, 2800, 2600
/home/users/myuser/test/image30.jpg, 1500, 1200

我如何使用 bash 脚本来实现这一点?我必须扫描数百万张图像。

答案1

通过 bash递归全局 和 ImageMagick 的identify命令:

shopt -s globstar
identify -format "%f, %w, %h\n" **/*.{png,jpg,jpeg}

将这些输出保存到文件只是添加> mylog.txt到上一个命令的问题,即

identify -format "%f, %w, %h\n" **/*.{png,jpg,jpeg} > mylog.txt

从那里,您可以使用awkperl来比较mylog.txt

awk -F ',' '$2 > 800 && $3 > 600' mylog.txt

awk这里使用,作为列的分隔符,的通常结构awk/PATTERN/{COMMANDS},如果省略 ,则默认仅打印{COMMANDS};在上面的特定示例中,如果模式$2 > 800 && $3 > 600为真,即它是高于所需分辨率的图像,则会将其打印到屏幕上。

并且可能会跳过中间的日志步骤,直接用管道传输所有内容会更好一些:

shopt -s globstar
identify -format "%f, %w, %h\n" **/*.{png,jpg,jpeg} | awk -F ',' '$2 > 800 && $3 > 600' > filtered_images.txt

如果遇到arguments list too long错误,通常find命令是递归遍历目录树的更好方法。identify可以通过find-exec标志调用,并且过滤仍然可以通过以下方式处理awk

$ find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -exec identify -format "%f, %w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600' 
fanart.jpg, 1920, 1080
fanart.jpg, 1920, 1080
globalsearch-background.jpg, 1920, 1080
fanart.jpg, 1280, 720

像往常一样,不要忘记将> log2.txt所有内容保存到文件中。

可以通过两种方式之一处理文件的完整路径。一种是在命令的格式字符串%d/%f中指定,或者使用的选项。即identifyfind-printf

find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -exec identify -format "%d/%f, %w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600'

或者

find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -printf "%p, " -exec identify -format "%w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600'

相关内容