在 Linux 目录中查找高于特定分辨率的图像

在 Linux 目录中查找高于特定分辨率的图像

这是我之前提出的问题的后续问题这里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正如您已经知道的那样,我只是/%fidentify命令中删除了不必要的文件名。

相关内容