我想扫描目录中的所有图像(在子文件夹中递归扫描),并找到分辨率高于特定阈值的图像(例如,至少具有分辨率的图像,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
从那里,您可以使用awk
或perl
来比较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
中指定,或者使用的选项。即identify
find
-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'