web-dev-qa-db-ja.com

解像度に基づいてLinuxディレクトリで画像を検索する

ディレクトリ内のすべての画像(サブフォルダー内で再帰的に)をスキャンし、特定のしきい値より高い解像度の画像(たとえば、少なくとも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

それをbashスクリプトを使用してどのように行うことができますか?何百万もの画像をスキャンする必要があります。

6
Tina J

Bashの 再帰的グロブ およびImageMagickのidentifyコマンドを介して:

shopt -s globstar
identify -format "%f, %w, %h\n" **/*.{png,jpg,jpeg}

そのような出力をfileに保存するには、前のコマンドに> mylog.txtを追加するだけです。

identify -format "%f, %w, %h\n" **/*.{png,jpg,jpeg} > mylog.txt

そこから、awkまたはPerlを使用してmylog.txt列を比較できます

awk -F ',' '$2 > 800 && $3 > 600' mylog.txt

ここでawkは列の区切り文字として,を使用し、awkの通常の構造は/PATTERN/{COMMANDS}で、{COMMANDS}が省略された場合のデフォルトは印刷のみです。上記の特定の例では、パターン$2 > 800 && $3 > 600がtrueの場合、つまり、それが目的の解像度を超える画像である場合、画面に印刷されます。

そして、おそらくその間のログステップをスキップして、すべてをパイプするほうが少し良いでしょう:

shopt -s globstar
identify -format "%f, %w, %h\n" **/*.{png,jpg,jpeg} | awk -F ',' '$2 > 800 && $3 > 600' > filtered_images.txt

arguments list too longエラーが発生した場合、通常はfindコマンドを使用すると、ディレクトリツリーを再帰的にたどることができます。 identifyfind-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

いつものように、> log2.txtを追加してすべてをファイルに保存することを忘れないでください。

ファイルへのフルパスは、2つの方法のいずれかで処理できます。 1つは、identifyコマンドのフォーマット文字列に%d/%fを指定するか、find-printfオプションを使用します。それは

find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -exec identify -format "%d/%f, %w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600'

または

find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -printf "%p, " -exec identify -format "%w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600'
6