2009-06-11 3 views
7

"abc"와 같은 특정 패턴으로 시작하는 디렉토리에서 파일을 검색해야합니다. 또한 결과에서 ".xh"로 끝나는 모든 파일을 제거해야합니다. Perl에서 어떻게하는지에 대해 잘 모르겠습니다. 모든패턴에 의한 파일 이름 필터링

opendir(MYDIR, $newpath); 
my @files = grep(/abc\*.*/,readdir(MYDIR)); # DOES NOT WORK 
나는 또한로 끝나는 결과에서 모든 파일을 제거 할 필요가

감사합니다 ".xh", 동성

답변

7

은 MYDIR가 디렉토리의 경로를 포함하는 문자열입니다

@files = grep {!/\.xh$/} <$MYDIR/abc*>; 

을 시도합니다.

+0

문자열 끝 부분에 그 정규 표현식을 고정시키고.를 이스케이프 처리해야합니다. 어떻게 든 (나는 성격 학급을 사용하는 것을 좋아한다). 정규 표현식은 "abcxh.txt"와 일치합니다. 대신에 /[.]xh$/을 시도하십시오. –

+0

감사합니다. –

+0

이상하게도 형식을 올바르게 지정하는 데 많은 문제가있었습니다. 기간을 벗어 났지만 탈출하지 않는 한 표시되지 않습니다. 또한 < 및 >은 투쟁했습니다! $ anchor를 잡아 주셔서 감사합니다. 나는이 케이스를 테스트하지 않았습니다. 수정 됨. –

-1
foreach $file (@files) 
{ 
    my $fileN = $1 if $file =~ /([^\/]+)$/; 

    if ($fileN =~ /\.xh$/) 
    { 
      unlink $file; 
      next; 
    } 
    if ($fileN =~ /^abc/) 
    { 
      open(FILE, "<$file"); 
      while(<FILE>) 
      { 
      # read through file. 
      } 
    } 
} 

:

나는 이런 식으로 뭔가를 디렉토리의 파일은 다음을 수행하여 액세스 할 수 있습니다.

$DIR = "/somedir/somepath"; 
foreach $file (<$DIR/*>) 
{ 
    # apply file checks here like above. 
} 

또는 펄 모듈 File :: find를 사용할 수 있습니다.

7

opendir (MYDIR, $ newpath); 내 @files = grep (/ abc *. * /, readdir (MYDIR)); #DOES NOT WORK

glob 패턴으로 정규식 패턴을 혼동하고 있습니다.

#!/usr/bin/perl 

use strict; 
use warnings; 

opendir my $dir_h, '.' 
    or die "Cannot open directory: $!"; 

my @files = grep { /abc/ and not /\.xh$/ } readdir $dir_h; 

closedir $dir_h; 

print "$_\n" for @files; 
3
opendir(MYDIR, $newpath) or die "$!"; 
my @files = grep{ !/\.xh$/ && /abc/ } readdir(MYDIR); 
close MYDIR; 
foreach (@files) { 
    do something 
} 
2

그 kevinadc와 신안 Unur 사용하지만, 언급되지 않은 점은리스트 문맥에서 호출 할 때 readdir() 디렉토리에있는 모든 항목의 목록을 반환합니다. 그런 다음 목록 연산자를 사용할 수 있습니다. 그것은 당신이 사용할 수있는 이유는 다음과 같습니다 그래서

my @files = grep (/abc/ && !/\.xh$/), readdir MYDIR; 

:

readdir MYDIR 

는 MYDIR에있는 모든 파일의 목록을 반환합니다.

그리고 :

grep (/abc/ && !/\.xh$/) 

반환 모든 요소가 기준과 일치 readdir MYDIR으로 돌아왔다.

+0

두 번째 검사가 /\.xh$/가되도록 수정하면 올바른 것을 확인할 수 있습니다. :) –

-1

대신 opendir 및 필터링 readdir를 사용하는 (closedir하는 것을 잊지 마세요!), 대신 glob 사용할 수 있습니다 : 당신이 glob의 결과에 접두사 $newpath 제거에 대해 걱정하지 않는 경우

use File::Spec::Functions qw(catfile splitpath); 

my @files = 
    grep !/^\.xh$/,    # filter out names ending in ".xh" 
    map +(splitpath $_)[-1],  # filename only 
    glob       # perform shell-like glob expansion 
     catfile $newpath, 'abc*'; # "$newpath/abc*" (or \ or :, depending on OS) 

map+splitpath을 제거하십시오.

+0

지도 나 splitpath가 필요 없습니다. 그것은 .xh로 끝나거나 끝나지 않습니다. 추가 작업으로 변경되지 않습니다. –

+0

응? glob ("./ abc *")는 ("./abc.txt", "./abc.xh")를 반환합니다. 그 외의 다른 방법을 ("abc.txt")까지 어떻게 예상합니까? – ephemient