#!/usr/local/bin/perl $imagesizeX = 200; $imagesizeY = 200; $filesize = 5; # Kbyte 単位 @pngfig = ( '89' , '50' , '4e' , '47' , '0d' , '0a' , '1a' , '0a' ); # 89 50 4e 47 0d 0a 1a 0a @jpgfig = ( 'ff' , 'D8' , 'ff' , 'e0' ); @jpgfig2 = ( '4A' , '46' , '49' , '46' , '0' ); # SOI / APP0 / 2byte / "JFIF\0" @giffig = ( '47' , '49' , '46' , '38' ); # GIF / 87a or 89a @filesig = ( 'PNG' , 'JPEG' , 'GIF' , 'MPEG' , 'RAM' , 'QT' , 'ARC' , 'OTHER' , 'other' ); # extension @extmpg = ( 'mpg' , 'mpeg' , 'mpa' , 'mpe' ); @extram = ( 'ram' , 'rm' , 'ra' ); @extqt = ( 'qt' , 'mov' ); @extarc = ( 'zip' , 'lzh' , 'rar' , 'cab' , 'exe' ); @extoth = ( 'avi' , 'mp3' , 'wav' , 'm1v' , 'm2v' ); @extension = ( 'extmpg' , 'extram' , 'extqt' , 'extarc' , 'extoth' ); # === $filesize *= 1024; if( $#ARGV == -1 ){ @ARGV = ('.'); } foreach $file ( @ARGV ){ if( -d $file ){ &makelist( $file , $file ); } if( $file eq '' ){ last; } } sub makelist{ my( $base , $dirbase ) = @_; my( $file ); my( @filelist ); if( $base eq '' ){ return ;} chdir( $base ); print ":$base:$dirbase:\n"; $rc = opendir( DIR , '.' ); if( $rc eq '' ){ print "ERROR\n"; exit; } @filelist = readdir( DIR ); closedir( DIR ); foreach $file ( @filelist ){ if( $file eq '.' || $file eq '..' ){ next }; if( -d $file && ! ( -l $file ) ){ print "(DIR)\t$dirbase/$file\n"; # ディレクトリ &makelist( $file , "$dirbase/$file" ); } else { # ディレクトリ以外 $rc = &checkfile( $file ); print "($rc)\t$dirbase/$file\n"; } } chdir( '..' ); } sub checkfile{ my( $filename ) = shift @_; my( $rc ) = "Unknown"; my( $buf1 , @buf2 , $trc , $end , $check ); my( $filesizet , @fst , $fsC , $imX , $imY , $imC ); my( $c1 , $c2 , $c3 ); # ファイルサイズのチェック #@fst = stat($filename); #$filesizet = $fst[7]; $filesizet = -s $filename; if( $filesizet == 0 ){ return 'OZEother'; } if( $filesizet >= $filesize ){ $fsC = 'B'; } else { $fsC = 'S'; } # PNG 8 fing / 4 -> n / 4 "IHDR" / 13(n) -> "IHDR" data # JPEG 18 # GIF 10 # ファイルが画像であるかどうかのチェックと、 # 画像ファイルである場合は、どのサイズかのチェックは # ファイル先頭の、 30 byte ほどが必要……? open( FDAT , "$filename" ); $trc = read( FDAT , $buf1 , 256 ); close( FDAT ); if( $trc == '' ){ return "Error" ; } # データ読み込み完了/解析開始 @buf2 = unpack( "C*" , $buf1 ); # PNG チェック $check = 0; for( $i = 0 ; $i < 8 ; $i++ ){ if( $buf2[$i] != hex( $pngfig[$i] ) ){ $check = 1; last; } } if( $check == 1 ){ # PNG 以外 / JPEG チェック for( $i = 0 ; $i < 4 ; $i++ ){ if( $buf2[$i] != hex( $jpgfig[$i] ) ){ $check = 2; last; } } if( $check == 1 ){ # JPEG 2 for( $i = 0 ; $i < 5 ; $i++ ){ if( $buf2[$i+6] != hex( $jpgfig2[$i] ) ){ $check = 2; last; } } } } if( $check == 2 ){ # PNG / JPEG 以外 for( $i = 0 ; $i < 4 ; $i++ ){ if( $buf2[$i] != hex( $giffig[$i] ) ){ $check = 3; last; } } if( $check != 3 ){ # GIF 2 if( !( ( $buf2[4] == hex( '37' ) || $buf2[4] == hex( '39' ) ) && $buf2[5] == hex( '61' ) ) ){ $check = 3; } } } # $check # 0 : PNG # 1 : JPEG # 2 : GIF # 3.. : 画像データ以外 if( $check == 3 ){ # 拡張子によるチェック $c1 = 'O'; $end = 0; foreach $ext ( @extension ){ foreach $ext2( @$ext ){ if( $filename =~ /\.$ext2$/i ){ $end = 1; last; }; } if( $end == 1 ){ last; }; $check++; } # ファイルサイズチェック/サイズチェックの部分の無効化 $c2 = $fsC; $c3 = 'E'; } else { $c1 = 'I'; # 画像データの場合はサイズチェック if( $check == 0 ){ # PNG 画像 # 8 byte fing # 4 byte chank size # 4 byte chank name # IHDR : 4byte X / 4 byte Y $imX = ( $buf2[16] << 24 ) | ( $buf2[17] << 16 ) | ( $buf2[18] << 8 ) | $buf[19]; $imY = ( $buf2[20] << 24 ) | ( $buf2[21] << 16 ) | ( $buf2[22] << 8 ) | $buf[23]; } elsif( $check == 1 ){ # JPEG 画像 $imX = ( ( $buf2[0xA5] & 0xFF ) << 8 ) | ( $buf2[0xA6] & 0xFF ); $imY = ( ( $buf2[0xA3] & 0xFF ) << 8 ) | ( $buf2[0xA4] & 0xFF ); } else { # GIF 画像 $imX = ( $buf2[7] << 8 ) | $buf2[6]; $imY = ( $buf2[9] << 8 ) | $buf2[8]; } # イメージサイズによる大きさチェック if( $imX >= $imagesizeX ){ $imX = 'B'; } else { $imX = 'S'; } if( $imY >= $imagesizeY ){ $imY = 'B'; } else { $imY = 'S'; } if( $imX eq 'B' && $imY eq 'B' ){ $imC = 'I'; } elsif( $imX eq 'B' && $imY eq 'S' ){ $imC = 'X'; } elsif( $imX eq 'S' && $imY eq 'B' ){ $imC = 'Y'; } else { $imC = 'S'; } $c2 = 'B'; if( $imC eq 'I' && $fsC eq 'B' ){ $c3 = 'B'; } elsif( $imC ne 'S' && $fsC eq 'S' ){ $c3 = $imC; } elsif( $imC ne 'I' && $fsC eq 'B' ){ if( $imC eq 'X' ){ $c3 = 'x'; } elsif( $imC eq 'Y' ){ $c3 = 'y'; } else { $c3 = 'F'; } } else { $c2 = 'S'; $c3 = 'S'; } } $rc = "$c1$c2$c3$filesig[$check]"; return $rc; } #00000090 28 28 28 28 28 28 28 28 - 28 28 28 28 28 28 FF C0 (((((((( ((((((.. #000000A0 00 11 08 00 F0 01 40 03 - 01 22 00 02 11 01 03 11 _.._..@. ."_..... # ~~~~Y ~~~~X #000000B0 01 FF C4 00 1F 00 00 01 - 05 01 01 01 01 01 01 00 .. # c1 = I / O : Image / Other # c2 = Big / Small # c3 = :Image Only: # F / I / B / X / Y : File size / Image size # : / Between / X size only / Y size only # x / y : X size and File size / Y size and File size # S : small # E : Extension