2010-05-12 2 views

답변

11

당신은 -f 파일 테스트 연산자와 함께 opendir, readdirclosedir 기능을 사용해야합니다

opendir(my $dh, $some_dir) || die $!; 
while(my $f = readdir $dh) { 
    next unless (-f "$some_dir/$f"); 
    print "$some_dir/$f\n"; 
} 
closedir $dh; 
+1

File :: Find는 내 의견으로는 더 일반적이며 더 나은 대답입니다. –

+3

전체 트리의 깊이 우선 탐색을 원하지 않는다면, File :: Find는 찾고있는 드로이드가 아닙니다. –

1

readdir 연산자가 필요합니다.

예를 들어

:

#! /usr/bin/perl 

use warnings; 
use strict; 

my $dir = "/tmp/foo"; 
opendir my $dh, $dir 
    or die "$0: opendir: $!"; 

while (defined(my $name = readdir $dh)) { 
    next unless -f "$dir/$name"; 
    print "$name\n"; 
} 

그것을 실행 : 당신이 볼 수 있듯이

$ ls -F /tmp/foo 
a b c d/ 

$ ./prog.pl 
b 
c 
a

는, 이름이 필요하지 않다가 파일 시스템에 물리적으로 저장되어있는 순서에 나와 정렬.

당신은 또한 당신이 결과에서 디렉토리를 제거해야합니다

print map { s!^.*/!!; "$_\n" } 
     grep !-d $_ => 
     </tmp/foo/*>; 

주에서와 글로브 연산자를 사용할 수있는, 더러운 빠른 및-경로를 이동하려면, 그리고 글로브 연산자는하지 않습니다 이름이 점으로 시작하는 파일을 리턴합니다.

2

사용 File::Find. 그것은 핵심 모듈입니다.

use File::Find; 
find(\&wanted, @directories_to_search); 
sub wanted 
{ 
    my $file = shift; 
    return unless (-f $file); 
    #process file 
} 
+1

이것은 이미 작성되고 테스트 된 라이브러리를 사용하므로 가장 좋은 대답입니다. File :: Find는 핵심 Perl에 있으므로 아무 것도 설치할 필요가 없습니다. – Ether

+7

이것은 지정된 디렉토리의 모든 서브 디렉토리에있는 모든 파일을 반복적으로 나열한다는 점에 유의하십시오. – toolic

3

파일 테스트 "연산자"(실제로는 함수)를 사용하여 원하는 파일 종류를 확인할 수 있습니다. 현재 디렉토리가 그렙와 파일 글로브 사용 검사 할 간단한 경우

: 그렇지 않으면

my @files = grep -f, <*>; 

을, 당신은 디렉토리 핸들을 작동 할 수 있습니다

opendir my $dh, $dirpath; 

my @files = grep -f, readdir($dh); 

closedir $dh; 

opendir를 참조하십시오, readdir, closedir, -Xgrep.

5

디렉토리에있는 모든 파일을 나열하는 또 다른 방법은 CPAN 모듈 File::Slurp에서 read_dir 기능을 사용하는 것입니다

use strict; 
use warnings; 
use File::Slurp qw(read_dir); 

my $dir = './'; 
my @files = grep { -f } read_dir($dir); 

그것은 당신을 위해 검사를했던 opendir 수행합니다. "숨겨진"파일 (점으로 시작하는 파일)이 포함됩니다. 이것은 지정된 디렉토리의 서브 디렉토리에있는 파일을 재귀 적으로 나열하지 않습니다.

CPAN에서
1

File::Find::Rule는이 완전히 사소한 수 있습니다 :

use File::Find::Rule; 
my @files = File::Find::Rule->file->in($directory); 

이 지정된 디렉토리 또는 하위 디렉토리의 모든 파일을 찾습니다. 나는 극도의 유연성과 단순성의 결합 때문에 이것을 추천한다.

+0

다음과 같은 경로에있는 모든 파일을 찾을 수 있습니다 : a/**/**/b/**/c.txt – yarian

+0

확실! 파일 다음에 name() 호출을 추가하기 만하면되지만 Unix 스타일의 와일드 카드 (단일 별표)를 사용해야합니다. 이름 ('. * something [A-Z]. * \. foo')을 원하면 정규 표현식을 사용할 수도 있습니다. 그래서 예제 파일을 찾기 위해 File :: Find :: Rule-> file-> name ('a/*/*/b/*/c.txt') -> ($ directory)라고 말할 수 있습니다. –

관련 문제