2012-04-11 3 views
0

디렉토리에 저장된 파일 이름의 시작 부분과 일치해야하는 Perl 변수에 저장된 문자열이 있습니다.Perl의 grep을 사용하여 이름에 패턴을 일치시켜 특정 파일을 찾는 방법

이 변수를 사용하여 Perl의 grep을 사용하여 디렉토리에서이 패턴과 일치하는 파일을 찾습니다. 여기에 내가 뭐하는 거지입니다 :

opendir (DIR, "data/testroot/") or die "$!"; 
    @file1 = <$f1/*.hdf> 
    foreach(@file1){ 
     $patt = substr(basename($_),0,$ind); 
     $file2 = grep {/${patt}*\.hdf/} readdir(DIR); 
     #other code follows....... 
    } 
    closedir(DIR); 

첫째, 폴더 f1에있는 모든 파일의 목록을 얻을하고 배열 @file에 저장. 그런 다음 @file1의 각 항목에 대해 처음 몇자를 추출하여 $patt에 저장 한 다음 에 저장된 것과 일치하는 시작 패턴을 가진 다른 폴더 data/testroot/에서 비슷한 파일을 선택하려고합니다.

해당 grep $file2 = grep {/${patt}*\.hdf/} readdir(DIR);이 작동하지 않습니다.

답변

0

${patt}*\.hdf은 "$ patt가 0 번 이상 발생하고 .hdf가 뒤따라야 함"을 의미합니다. "$ patt, 임의의 텍스트, .hdf"순 의미하지 않습니까?

그러면 /${patt}.*\.hdf/이됩니다.

+0

예 '$ {patt}'다음에 하나 이상의 문자를 입력하고 '.hdf'를 입력하고 싶습니다. 덕분에 그 부분을 얻었습니다. 그러나'$ file2 = grep {/${patt}.*\.hdf}/} readdir (DIR);과 같이 줄을 바꿀 때 여전히 파일을 선택하지 않습니다. 뭔가 잘못 됐어. – srsci

+0

아니요, 내 실수는 미안합니다. 나는 거기에 여분의'}'을 가지고있어서 문제를 일으켰다. 고마워. 나는 새로운 것을 배웠다. – srsci

1

디렉토리 B에있는 모든 파일의 파일 이름이 첫 번째 $ind 자와 일치하는 디렉토리 A에 모든 *.hdf 파일을 찾으려고합니다.

두 디렉터리 모두에 glob 또는 readdir 중 하나만 사용해야합니다. 둘 다 사용할 수는 없습니다. 이 경우 glob이 최선의 방법 인 것 같습니다. 정규식을 사용하지 않고도 *.hdf 개의 파일을 모두 선택할 수 있습니다.

아래 프로그램은 필요한 것을 수행하는 것으로 보입니다. $f1$ind에 대한 샘플 값을 대체했습니다.

use strict; 
use warnings; 

use File::Basename; 

my $f1 = 'data'; 
my $f1 = 'data/testroot'; 
my $ind = 6; 

foreach (glob "$f1/*.hdf") { 
    my $patt = substr(basename($_), 0, $ind); 
    my @match = glob "$f2/$patt*.hdf"; 

    #other code follows....... 
} 
+0

grep이 필요한지 궁금합니다. '$ patt'가 다른 파일 이름의 특별한 것이 아니라면, $ patt * .hdf "'그것을 glob하지 않을 것입니까? –

+0

그래,하지만'glob'는 루프에서 실행될 때 대체 파일이 누락되어 grep으로 돌아 가야했습니다. – srsci

+0

또한 이렇게하면 :'$ patt = substr (basename ($ _), 0, $ ind); 내 @ file2 = grep {basename ($ _) = ~/^ \ Q $ patt /} glob <$f2/*.hdf>;'작동하지 않는 것 같습니다. '$ _'는 첫번째 폴더'A'에서 읽은 첫 번째 파일 이름을 유지합니다. 그렇다면'glob '의 출력을'grep'에 파이프하는 방법은 무엇입니까? 한가지 더 말하면, PERL은'basename'에'$ _'을 사용하도록 강제합니다. 그렇지 않으면 에러가 발생합니다. PERL에 멍청한 사람이되어 죄송합니다. 내 질문 중 일부가 어리석게 들릴 수 있습니다. – srsci

관련 문제