サイズで画像を検索:find / file / awk


9

私は一定の高さ(500px以上)のpng画像ファイルを見つけようとしています。私はそれfileが画像の寸法を返すことを知っています。例:

$ file TestImg1a.png

TestImg1a.png: PNG image data, 764 x 200, 4-bit colormap, non-interlaced   

しかし、私はこれを使用して、高さが500pxを超えるディレクトリ内のすべてのファイルを検索する必要があります。高さに関係なくすべてのファイルを印刷する方法を知っています。

find . -name '*.png' | xargs file | awk '{print $7 " " $1}'

しかし、どうすれば$ 7を500を超える結果に制限できますか?

回答:


7

私はこれが少しやり過ぎだと知っていますが、これは常に(ファイル名にスペースが含まれている場合でも)、ファイルが情報を表示する方法に関係なく機能します。

find . -name '*.png' -exec file {} \; | sed 's/\(.*png\): .* \([0-9]* x [0-9]*\).*/\2 \1/' | awk 'int($1) > 500 {print}'

画像とファイルの寸法を印刷します

説明:

  1. find下の* .pngという名前のすべてのファイル。それぞれにファイルを作成します

  2. sedファイル名と寸法のみを印刷するために使用し、次に寸法を印刷するために並べ替えます

  3. awk最初の数値(写真の高さ)をテストして、500より大きいこと、および印刷寸法とファイル名である場合は何もしないことを確認するために使用します。


ありがとう。awkの引数の$ 1を$ 3に変更する必要がありました。しかし、これは間違いなく私のためにそれを手に入れました。
steve-er-rino 2012年


5

シェルユーティリティ以外のものがより適切だと思います。たとえば、Perl:

#!/usr/bin/perl

use File::Find;
use Image::Info qw(image_info dim);

find (\&check_height, './');

sub check_height {

  my $info = image_info( $_ );
  my ($width, $height) = dim( $info );
  print $_ . " has height $height\n" if ( $height > 500 );

}

$ 7を解析しようとすることで、次々と手間を省くことができます。寸法を直接取得するだけです。はい、Image :: Infoモジュールが必要になりますが、CentOS / RHELでは標準パッケージなので、を実行するだけで済みますyum install perl-Image-Info


1
通常、perlは優れたソリューションですが、この場合は当てはまりません。特に、Image :: Infoもインストールオプションもないためです。
steve-er-rino 2012年

1
perlの解決策は、やや速いいいです検索/ファイル/ awkの1、より、とUbuntu上の画像情報モジュールから利用可能である派生物apt-get install libimage-info-perl
rivimey

5

identifyImageMagickからも使用できます。

find . -name \*.png -print0|xargs -0 identify -format '%h %f\n'|
awk '$1>500'|cut -d' ' -f2-

またはOS Xの場合:

mdfind 'kMDItemFSName=*.png&&kMDItemPixelHeight>500' -onlyin .

0
find . -name '*.png' -exec file "{}" \+ | awk -F"(: +PNG image data|,| x )" '$4 > 500 {print $4" "$1}'

動作しません:96, ./4/45445106_w185.png: 86, ./4/404358x_w185.png: 86, ./4/404341x_w185.png: 80, ./4/475986_w185.png: 621, ./4/481693_w185.png: 667, ./4/42513x_w185.png: 86, ./4/404372x_w185.png:
steve-er-rino '25年

@tink、比較の前に$ 7をintにキャストします。つまり、int($ 7)> 500 ..キャストしない場合、awkはリテラル文字列比較に頼っています
iruvar

スティーブ、「、」はどこから来たの?私の「ファイル」はそれを生成しません。しかし、チャンドラが言ったように:彼のコメントで指摘された方法を使用して、明示的に$ 7を整数にすることができます。
2012年

awkステートメントは、ファイル名にスペースがない場合にのみ機能します
h3rrmiller

@tink "、"は、私の環境で返されるファイルの一部です。
steve-er-rino 2012年

0

このソリューションも機能します。コードの最後の部分(mv "$img" ./lowpixel)は、指定された幅と高さの下のファイルをフォルダーに移動します。次の例では、300x300未満のすべてのjpg画像がという名前のフォルダーに移動されますlowpixel

find -iname \*.jpg | while read img; do anytopnm "$img" | pamfile | perl -ane 'exit 1 if $F[3]<300 || $F[5]<300' || mv "$img" ./lowpixel; done

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.