按大小查找图像:查找/文件/ awk


9

我一直在尝试找到一定高度(超过500像素)的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的结果?

Answers:


7

我知道这有点矫kill过正,但这每次(即使文件名中有空格)都会起作用,无论文件如何显示信息。

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。但这绝对对我有用。
2012年


5

我觉得,除了shell实用程序外,还有其他更合适的方法,例如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也没有安装选项。
2012年

1
perl解决方案比find / file / awk解决方案要快一些,这很好,而且在ubuntu上派生的图像信息模块可从apt-get install libimage-info-perl
rivimey 2014年

5

您也可以identify从ImageMagick 使用:

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 2012年

@tink,在比较之前将$ 7转换为一个int,即int($ 7)> 500 ..在没有转换awk的情况下,求助于文字字符串比较
iruvar

史蒂夫,那个“,”从哪里来?我的“文件”没有产生该文件。但是正如钱德拉说的那样:您可以使用他的注释中指出的方法,将$ 7明确强制为整数。
2012年

您的awk语句仅在文件名中没有空格时才起作用
h3rrmiller 2012年

@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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.