これは、以前の質問 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
どのようにそのことについて:
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
を削除しました。