ディレクトリ内のすべての画像(サブフォルダー内で再帰的に)をスキャンし、特定のしきい値より高い解像度の画像(たとえば、少なくとも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スクリプトを使用してどのように行うことができますか?何百万もの画像をスキャンする必要があります。
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
コマンドを使用すると、ディレクトリツリーを再帰的にたどることができます。 identify
はfind
の-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'