web-dev-qa-db-ja.com

ImageMagickが指定されたサイズよりも低い画像と一致しない

これは これ へのフォローアップの質問です。

これまでのところ、次のfindコマンドをまとめました。これは、印刷することを目的としています(そして、適切にテストされたら、-delete)200 x 200px以下のすべてのJPG:

find . -iname "*.jpg" -type f -exec bash -c 'for i; do size=($(identify -format "%wx%h" "$i")); (( size[1] < 200 && size[2] < 200 )); done;' \; -print

ただし、コマンドをwc -lは、ターゲットセット内のすべての画像を選択していることを示します。

それをforループ自体に分解すると、200pxよりはるかに大きい画像をループしていることがわかります。

for i in *.jpg; do size=($(identify -format "%wx%h" "$i")); (( size[1] < 200 || size[2] < 200 )); echo $size; done;

210x163    
1920x1200
1920x1200
240x240
246x138
215x215
1920x1200
1920x1200
240x240
240x240
1920x1200

私には、これはidentifyが、指定されたサイズよりも低い画像のみを照合できなかった原因である可能性があることを示しているようですが、私が知る限り、照合の構文は次のとおりです。正しい。

誰がこれを引き起こしている可能性があるのか​​考えていますか?

3
Prometheus

findコマンドは この回答 から派生します。そこにバグがあることがわかりました。あなたはそれを複製しました。

これはバグです。Bashの配列は(( size[1] < 200 && size[2] < 200 ))からインデックス付けされているため、フラグメント(( size[0] < 200 && size[1] < 200 ))0である必要があります。リンクされた回答で使用されているスペース区切りの形式(-format "%w %h")を使用する必要があることに注意してください。そうしないと、アプローチが機能しません。

さらに、いくつかのバグを追加しました。

  • arbitrary-name {}の前に\;が必要です。 (リンクされた回答では、remove-filesが名前であり、+の代わりに\;が使用されています)。
  • \;の代わりに+を使用することを選択した場合、for iには意味がありません。 +を選択した場合、-printは常にtrueを返すため、-exec … {} +にはほとんど意味がありません。だからどちらか

    • -exec … {} \;、ループなし、-printは理にかなっています。または
    • -exec … {} +、ループあり、および-printが実行するはずだったことは、ループの内側に移動する必要があります。

forループ自体は、あなたが提示したように、構文的に有効なようです。しかし、それは主なバグに苦しんでいます。

200pxよりはるかに大きい画像をループしています

画像を調べる前に、与えられた画像が大きいかどうかをどうやって知ることができますか?すべての画像をループする必要があります。画像が小さいかどうかに応じて、条件付きで何かを実行できます。 echo $sizeは条件付きで実行されません。


修正されたコード:

  • -exec … \;

    find . -iname "*.jpg" -type f -exec bash -c '
       size=($(identify -format "%w %h" "$1"))
       (( size[0] < 200 && size[1] < 200 ))
    ' arbitrary-name {} \; -print
    
  • -exec … +

    find . -iname "*.jpg" -type f -exec bash -c '
       for i; do
          size=($(identify -format "%w %h" "$i"))
          (( size[0] < 200 && size[1] < 200 )) && printf "%s\n" "$i"
       done
    ' arbitrary-name {} +
    

前者のバリアントはファイルごとに1つのシェルを生成することに注意してください。後者の方が経済的です。

3