web-dev-qa-db-ja.com

Linuxディレクトリで特定の解像度よりも高い画像を検索する

これは、以前の質問 here からの追加質問です。サブディレクトリ内のすべての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
3
Tina J

どのようにそのことについて:

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にパイプされます。不要なファイル名を取り除くために、identifyコマンドから/%fを削除しました。

2
dessert