Tin*_*a J 7 command-line bash search find image-processing
我想扫描目录中的所有图像(在子文件夹中递归),并找到分辨率高于特定阈值的图像(例如,分辨率至少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
Run Code Online (Sandbox Code Playgroud)
我怎样才能使用 bash 脚本做到这一点?我必须扫描数百万张图像。
通过 bash 的递归 glob 和 ImageMagick 的identify命令:
shopt -s globstar
identify -format "%f, %w, %h\n" **/*.{png,jpg,jpeg}
Run Code Online (Sandbox Code Playgroud)
将这样的输出保存到 file ,只是添加> mylog.txt到上一个命令的问题,即
identify -format "%f, %w, %h\n" **/*.{png,jpg,jpeg} > mylog.txt
Run Code Online (Sandbox Code Playgroud)
从那里,您可以使用awk或perl比较mylog.txt列
awk -F ',' '$2 > 800 && $3 > 600' mylog.txt
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果遇到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
Run Code Online (Sandbox Code Playgroud)
像往常一样,不要忘记添加> log2.txt以将所有内容保存到文件中。
文件的完整路径可以通过以下两种方式之一进行处理。一,通过%d/%f在identify命令的格式字符串中指定,或使用find's-printf选项。那要么
find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -exec identify -format "%d/%f, %w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600'
Run Code Online (Sandbox Code Playgroud)
或者
find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -printf "%p, " -exec identify -format "%w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9398 次 |
| 最近记录: |