这是我之前提出的问题的后续问题这里jpeg
。我需要查找并记录子目录中分辨率高于特定数字(例如宽度高于 800)的所有图像的路径。
好吧,有数百万张图片,我想知道为什么find
下面的过程这么慢。所以我需要优化 bash 脚本以使其更快:
find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -exec identify -format "%d/%f, %w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600'
但是有一个有趣的特点:我有 4 个主要目录(1 到 4),每个目录都有 256 个子目录。每个子目录都有大约 5000 个子子目录,每个子目录大约有 10 张图片。所以看起来像major_dir/subdir/subsubdir/10.jpg
。有趣的特点是这些子子目录中的所有图像都具有相同的分辨率;所以我实际上不需要处理所有这 10 张图像。如果其中一个的分辨率满足要求,那么我只需要记录一条路径(子子目录路径)。这样,希望我能获得 10 倍更快的速度。另外,我的所有图像都是这样,.jpg
如果这也有帮助的话。
我如何在 Bash 脚本中执行此操作?理想的输出应如下所示(path, width_of_images_there, height)
/path/to/sub_dir1, 1600, 1200
/path/to/sub_dir2, 1600, 1200
/path/to/sub_dir3, 3200, 2400
/path/to/sub_dir4, 1000, 800
答案1
那个怎么样:
find /path/to/dir_with_major_dirs -path "*/*/*/*.jpg" -type f -exec bash -c '
for i; do
[[ "$p" = "${i%/*}" ]] || identify -format "%d, %w, %h\n" "$i"
p="${i%/*}"
done' _ {} + |
awk -F ',' '$2 > 800 && $3 > 600'
此测试针对每个jpg
文件,确定其路径是否与前一个文件的路径匹配,并且仅在其不匹配时运行identify
。输出通过管道传输到,awk
正如您已经知道的那样,我只是/%f
从identify
命令中删除了不必要的文件名。