web-dev-qa-db-ja.com

コマンドラインを使用して特定のピクセルサイズのすべての画像を見つける方法は?

幅または高さが300ピクセル未満のサブフォルダーを持つフォルダー内のすべてのJPG画像を検索しようとしています。

この方法で、古いサムネイルを検出して削除したいです。

確かにfindを使用してすべての画像を見つけることができます:

find . -iname "*.jpg" -type f | ...

しかし、パイプの後には何が続きますか?写真の属性を検出するためにどのパッケージを使用できますか?

16
mcbetz

identifyからimagemagickを使用でき、次のコマンドを使用できます。

find . -iname "*.jpg" -type f -exec identify -format '%w %h %i' '{}' \; | awk '$1<300 || $2<300'

-exec <command> '{}' \;を使用すると、ファイル名にスペースを含めることができます。代わりに、

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300'

-I{}が同じことを処理します。

identifyで気に入っているのは、出力形式を指定できることです。この場合、'%w %h %i'は、画像の幅、高さ、フルパス名を提供します。 awk式は、イメージが目的のサイズよりも小さい行のみを保持します。

出力の例:

64 64 ./thumbsup.jpg
100 150 ./photomin.jpg

編集:ファイル名のみ(たとえば、rmへのパイピング)が必要な場合は、awkステートメントの$line$3に変更するだけで、3番目の行。

17
Gerhard Burger

これは私のために働いた:

find . -iname "*.png" -type f -exec identify -format '%i %wx%h\n' '{}' \; | grep '75x75'

これは出力サンプルです:

./2520161636481000.png 75x75

./2620160819191100.png 75x75

./2420181545550700.png 75x75

1
osroflo

受け入れられた答えは非常に良いと思いますが、私は別の可能な解決策を追加したかった...

私は現在ImageMagickツールを最も頻繁に使用していますが、netpbmは画像処理の古くからの友人です。次のコマンドを使用して、任意の形式の画像のサイズを確認できます。

anytopnm file | pamfile

これにより、次のような出力が生成されます。

stdin:  PPM raw, 1650 by 1275  maxval 255

「パイプの後に続くもの」の質問に答えるために、xargsを使用するよりも頻繁にwhile readを使用します。質問に対する私のnetpbm回答は次のようになります。

find -iname \*.jpg | while read img; do \
  anytopnm "$img" | pamfile | \
    Perl -ane 'exit 1 if $F[3]<300 || $F[5]<300' || rm -v "$img"; \
done
1
NateT

identifyパッケージのimagemagickコマンドは、必要なことを行います。

$ identify abc.jpg
abc.jpg JPEG 1952x3264 1952x3264+0+0 8-bit DirectClass 1.111MB 0.000u 0:00.000

この場合も、grepを使用して画像サイズを整理する必要があります。

ただし、画像サイズの範囲が非常に広い場合を除き、findを使用して特定のサイズ以下のJPEGファイルを削除する方が簡単だと思われます。

find -iname '*.jpg' -size -10k -delete

(最初にチェックする-deleteなしで実行する価値は、あなたが保持したいものを見つけられない-そうでなければ削除する前にプロンプ​​トを表示しません)。

0
chronitis