
チャレンジ: 特定の文字列の存在を検出するには、imagemagick の「identify」コマンドの出力を解析する必要があります。存在しない場合は、ファイル名を画面にエコーします。
背景: サムネイル画像が約10万枚あります(分析が必要なサムネイルの例) それぞれのサムネイルを検査して、正しくレンダリングされていることを確認する必要があります。幸いなことに、「正しくレンダリングされている」かどうかは、サムネイルに赤いピクセルがあるかどうかで判断できます。imagemagick の「identify」コマンドを使用すると、「(255, 0, 0) #FF0000 red」という行を含むカラーマップを出力できます。
必要: bashスクリプトを使えば、すべてのファイル名を簡単に取得して繰り返し処理することができます。黙って出力を解析して文字列の一致を探し、見つからない場合はファイル名をエコーします。
具体的には、次のことを実行するスクリプトを作成したいと考えています。
1) 特定のディレクトリ内のすべての *.png ファイルを検索します。
2) 各ファイルに対して「identify -verbose」を実行し、黙って出力を...に渡します。
3) 出力を分析して、文字列「(255, 0, 0) #FF0000 red」が存在するかどうかを確認します。
3a) 見つかった場合は、何もせずに次のファイルに進みます。
3b) そうでない場合は、ファイル名をエコーします。
最終的には、赤いピクセルが含まれず、手動検査が必要なサムネイルの短いリストが残ります。
このスクリプトを作成する上での助けがあればほとんど感謝。
答え1
赤いピクセルがないファイルを検索するには:
for i in *png; do identify -verbose "$i" | gawk -e "{print \"$i\", \$0}" | fgrep -q '(255, 0, 0) #FF0000 red' || echo $i; done
赤いピクセルがあるファイルを検索するには:
for i in *png; do identify -verbose "$i" | gawk -e "{print \"$i\", \$0}" | fgrep -q '(255, 0, 0) #FF0000 red' && echo $i; done
gawk コマンドは、identify コマンドからの出力の各行にファイル名を追加します。grep ではなく fgrep を使用すると、完全に一致するテキストが検索されます (高速)。fgrep の -q フラグは、行を出力せず、ステータスを成功または失敗に設定するだけであることを指示します。
スクリプトは、スペースを含むファイル名に対して安全である必要があります。