これは これ へのフォローアップの質問です。
これまでのところ、次の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
が、指定されたサイズよりも低い画像のみを照合できなかった原因である可能性があることを示しているようですが、私が知る限り、照合の構文は次のとおりです。正しい。
誰がこれを引き起こしている可能性があるのか考えていますか?
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つのシェルを生成することに注意してください。後者の方が経済的です。