Showing posts with label perl. Show all posts
Showing posts with label perl. Show all posts

Saturday, March 22, 2014

Perl 을 이용한 중복화일 찾기



중복된 화일을 찾아주는 스크립트
화일 이름은 다르나 내용은 같은 즉, md5 hash 값을 기준으로 동일한
파일을 찾아준다.
이미지나 음악화일, 혹은 동영상 등등 중복된 화일을 찾을 수 있다.
활용한다면 중복 화일을 찾아 지우는것 활용해 볼 수 있다.

===========================================
#!/usr/bin/perl

use strict;
use warnings;
use File::Find;
use Digest::MD5;

#중복화일의 리스트를 담은 배열을 리턴
sub find_dups(@)
{
#인자로 넘겨받은 디렉토리
my @dir_list = @_;
if($#dir_list < 0) {
return (undef);
}

#size로 인덱싱됨.
my %files;

#화일 트리를 돌면서 모든 화일을 찾아 비슷한 사이즈의 화일을 담는다.
find( sub {
-f &&
push @{$files{(stat(_))[7]}}, $File::Find::name
}, @dir_list
);

my @result = ();

#md5 가 같은지
foreach my $size (keys %files) {
if ($#{$files{$size}} < 1) {
next;
}
my %md5; #file name array hash

#loop 돌면서 md5 sum check
foreach my $cur_file (@{$files{$size}}) {
open(FILE, $cur_file) or next;
binmode(FILE);
push @{$md5{
Digest::MD5->new->addfile(*FILE)->hexdigest}
}, $cur_file;
close (FILE);
}

#중복 검사
foreach my $hash (keys %md5){
if ($#{$md5{$hash}} >= 1) {
push(@result, [@{$md5{$hash}}]);
}
}
}
return @result
}

my @dups = find_dups(@ARGV);

foreach my $cur_dup (@dups) {
print "Duplicates\n";
foreach my $cur_file (@$cur_dup) {
print "\t$cur_file\n";
}
}
=============================================




Friday, March 21, 2014

Perl 을 이용한 file의 무결성 확인




 자신의 PC에서 어떠한 중요한 화일이 있다면 이 화일이 누군가에 의해서 변경되는것을
원치 않을 것이다. 혹은 의도하지 않은 어떤 변경으로 인해 이 화일이 변경되었는지
점검을 하고 싶을 수도 있고, 해킹이 되었는지 확인 하고 싶을것이다.

또는 소프트웨어 업그레이드가 어떠한 부분들을 건드리는지 궁금하다면 아래의
Perl Script를 사용하면 도움이 될것이다.

디렉토리 트리를 검색하기 위해 File::Find 모듈을 사용한다.

======================================
use strict;
use warnings;
use File::Find;
use Digest::MD5;
use Storable qw(nstore retrieve);

# 변경정보를 담는 화일을 생성
my $info_file_name = ".change.info";

#지정한 디렉토리내의 각 화일의 메시지 다이제스트 값을 생성 저장
sub md5($){
my $cur_file = shift;

open(FILE, $cur_file) or return ("");
binmode(FILE);
my $result = Digest::MD5->new->addfile(*FILE)->hexdigest;
close (FILE);
return ($result);
}

#최초 혹은 마지막으로 실행했을때의 화일의 md5값(비교대상)
my $file_info;

#현재 화일의 md5 hash값
my %real_info;

my @dir_list = @ARGV;

#화일이 있다면 정보를 읽어 들인다.
if (-f $info_file_name) {
$file_info = retrieve($info_file_name);
}

if ($#dir_list < 0){
print "Nothing to look at\n";
exit (0);
}

find( sub{
-f && ($real_info{$File::Find::name} = md5($_));
},@dir_list
);


#예전 화일의 md hash값과 현재의 md hash 값을 비교하여
# 새로 생성되었는지, 변경되었는지, 삭제 되었는지 확인.
foreach my $file (sort keys %real_info) {
if (not defined($file_info->{$file})){
print "New file: $file\n";
} else {
if ($real_info{$file} ne $file_info->{$file}){
print "Changed: $file\n";
}
delete $file_info->{$file};
}
}

foreach my $file (sort keys %$file_info){
print "Deleted: $file\n";
}

nstore \%real_info, $info_file_name;
========================================

한가지 단점은 실행할때마다 $file_info->{} 해시값이 %real_info 해시값으로
대체가 된다는 점이다. 즉 실행할 때 마다 현재의 값을 저장함으로 이전값과의
비교는 안된다는 점이다.
비교를 위해 실행한 후에는 그 결과값을 잘 저장을 해둬야 한다는 말씀!

무결성이 중요한 문서의 경우 이런 방법으로 문서의 위,변조를 확인 할 수 있다.













Thursday, August 1, 2013

Perl 을 이용한 간단한 네이버날씨 파싱


 Perl 이라는 언어는 언어적인 측면에서 아주 강력한 언어임엔 틀림없습니다.
특정 문서에서 반복적인 일련의 작업이라던지 시시각각 변하는 웹상의 글들을
파싱할 이유가 있다던지 할 땐 항상 Perl 이라는 언어를 떠올리게 됩니다.

Perl 을 처음 접한지 오래 되지는 않았고, 잘한다고 할 수준도 아니지만
Perl 을 처음 접하고 흥미를 느끼게 된 분들을 위해 간단한 웹 파싱 모듈을 소개합니다.

Perl 을 공부하셧던 분이라면 다들 들어 보셨을법한 LWP::Simple 이라는 모듈입니다.
워낙에 간단하고 기능이 좋아서 많이들 사용하는 것으로 알고 있습니다.

그날 그날 날씨를 확인 하려면 포털사이트로 접속해서 확인하곤 하는데
그마저도 귀찮아서 그냥 콘솔에서 확인 할 수 있도록 Perl로 간단히 만들었습니다.

=========================================================================
use LWP::Simple;
use Encode;

# 아래의 웹사이트로 접근하여 해당 지역의 날씨와 관련된 data를 긇어옵니다.
$url = "http://weather.naver.com/rgn/cityWetrWarea.nhn?cityRgnCd=CT001000";
$doc = get($url);
$doc = encode ('cp-949',$doc);          #한글관련 인코딩 변경

$doc =~ /<caption class="blind">(.+?)<\/caption>/g;
$doc = $';
$doc =~ /<div class="aside">/g;
$doc = $`;

#익명 해쉬로 돌려받음
$weather{'day'} = [ $doc =~ /<th scope="col">(.+?)<br><span>/g ];
$weather{'after'} = [ $doc =~ /<th scope="col" class="line">(.+?)<br><span>/g ];
$weather{'city'} = ["온도","날씨","강수"];
$weather{'temp'} = [ $doc =~ /<li class="nm">.+?<\/li>\s+<li>.+?<span class="temp"><strong>(.+?)<\/strong>.+?<\/span><br>\s+.+?<span class="rain"><strong>.+?<\/strong>.+?<\/span><\/li>/g ];

$weather{'atemp'} = [ $doc =~ /<th><a href\=\"\/rgn\/cityWetrCity\.nhn\?cityRgnCd\=CT0010\d{2}\">(.+?)<\/a><\/th>/g ];

$weather{'cloud'} = [ $doc =~ /<p class="icon"><img src\="http\:\/\/static\.naver\.net\/weather\/images\/w_icon\/.+?\.gif" width="64" height="46" alt="(.+?)"><\/p>/g ];

$weather{'rain'} = [ $doc =~ /강수확률\s+<span class="rain"><strong>(.+?)<\/strong>%<\/span>/g ];


#출력 부분
printf ("%-20s%-20s%-20s%-20s%-20s\n\n",$weather{'day'}[2],$weather{'day'}[0],$weather{'after'}[0],$weather{'day'}[1],$weather{'day'}[1]);

printf ("%-20s%-20s%-20s%-20s%-20s\n",$weather{'city'}[0],$weather{'temp'}
[12],$weather{'temp'}[13],$weather{'temp'}[14],$weather{'temp'}[15]);
printf ("%-20s%-20s%-20s%-20s%-20s\n",$weather{'city'}[1],$weather{'cloud'}[12],$weather{'cloud'}[13],$weather{'cloud'}[14],$weather{'cloud'}[15]);
printf ("%-20s%-20s%-20s%-20s%-20s\n",$weather{'city'}[2],$weather{'rain'}[0],$weather{'rain'}[13],$weather{'rain'}[14],$weather{'rain'}[15]);
=================================================
아래와 같이 간단히 수원지역의 날씨를 파싱해 왔습니다~
약간 수정을 거쳐야 하는 부분이 보이지만 숙제로 남겨 놓겠습니다~
참 그리고 저는 귀찮아서 use strict; use warnings; 는 쓰지 않았는데 
배우실땐 꼭 사용하시는것이 좋습니다.