2010-07-18 4 views
0

일련의 파일에서 누락 된 파일을 식별하고 해당 목록을 txt 파일로 내보내는 코드 행을 찾고 있습니다. 예를 들어, 1to100000이라는 디렉토리에는 1,2 ... 99999,100000이라는 이름의 pdfs가 있지만 시리즈 중 일부가 누락되었습니다. 그 스크립트가 txt 파일에 누락 된 파일을보고하고 싶습니다. 이상적으로 이것은 실행 가능한 펄 스크립트 일 것입니다. 감사합니다. Jake일련의 누락 된 파일을 찾는 코드

+0

더 명확히하십시오. "1to100000이라는 디렉토리에 1,2 ... 99999,100000이라는 이름의 pdfs가 포함되어 있습니다"라고 말하면 PDF 파일입니까? 시리즈를 정의하는 것은 무엇입니까? 파일 이름 또는 PDF 파일로만 정의 된 시리즈가 파싱되어야합니까? 더 좋은 질문은 더 나은 대답을 만들어냅니다 ... – dawg

+0

정수. 이 시리즈는 PDF 파일 세트입니다. 디렉토리 이름은 실제로 관련이 없습니다. 이러한 제약 조건을 쉽게 정의 할 수있는 x ~ x + 10000 개의 파일이 포함 된 폴더가 있습니다. 이 연속 시리즈에서 누락 된 파일을 알고 싶다면 어떻게해야합니까? – Jake

답변

3

1에서 100000까지 카운트하고 파일이 존재하는지 확인하십시오.

foreach my $num (1 .. 100000) { 
    my $fname = "1to100000/$num.pdf"; 
    print "missing $fname\n" unless -f $fname; 
} 
+0

100000 개의 통계가 100000 개의 readdir보다 상당히 느리다는 것을 알게 될 것입니다. – ysth

3

사용 readdir은 다음과 같습니다

my @expect = map "$_.pdf", 1..100000; 
my %notfound; 
@notfound{@expect} =(); 

opendir my $dirh, "1to100000" or die "Couldn't open directory: $!"; 
while (my $fname = readdir($dirh)) { 
    delete $notfound{$fname}; 
} 

for my $fname (@expect) { 
    if (exists $notfound{$fname}) { 
     print "missing $fname\n"; 
    } 
} 
0

는 (설정 : IntSpan 사용) 범위에서 누락 번호를 찾는 예입니다.

#!/usr/bin/perl 
use strict; 
use warnings; 

use Set::IntSpan; 

# the last sector on disk 
my $end_sect = 71127179; 

# The complete range of sectors on the disk 
my $range = Set::IntSpan->new("0-$end_sect"); 

# The ranges of used sectors 
my $used = Set::IntSpan->new( 
'0-1048706,1048707-2097414,69078879-71127179'); 

# Calculates the remaining unused sectors 
my $unused = $range->diff($used); 

print $unused->run_list; 
관련 문제