2008-08-22 7 views

답변

45
opendir(D, "/path/to/directory") || die "Can't open directory: $!\n"; 
while (my $f = readdir(D)) { 
    print "\$f = $f\n"; 
} 
closedir(D); 

편집 : 아, 죄송합니다 "배열로"부분을 놓친 :

my $d = shift; 

opendir(D, "$d") || die "Can't open directory $d: $!\n"; 
my @list = readdir(D); 
closedir(D); 

foreach my $f (@list) { 
    print "\$f = $f\n"; 
} 

EDIT2 : 다른 답변의 대부분은 유효하다, 그러나 나는, 특히 this answer에 대해 언급하고 싶어하는 이 솔루션이 제공됩니다 :

opendir(DIR, $somedir) || die "Can't open directory $somedir: $!"; 
@dots = grep { (!/^\./) && -f "$somedir/$_" } readdir(DIR); 
closedir DIR; 

첫째, 포스터하지 않았다 이후 무엇을하는지 문서화 : 그것은 grep()t을 통해 readdir()에서 반환 된 목록을 통과하는 것 hat은 파일 (디렉토리, 장치, 명명 된 파이프 등과는 대조적으로)이면서 도트로 시작하지 않는 값 (목록 이름 @dots을 오도할만한 값만 반환합니다. 그러나 그 값은 복사 할 때 변경 한 것이기 때문입니다 readdir() 문서에서). 그것이 반환하는 디렉토리의 내용을 제한하기 때문에, 나는 기술적으로이 질문에 대한 정답이라고 생각하지 않지만, Perl에서 파일 이름을 필터링하는 데 사용되는 일반적인 관용구를 보여 주므로 문서화하는 것이 중요하다고 생각했습니다. 많이 본 또 다른 예는 다음과 같습니다

@list = grep !/^\.\.?$/, readdir(D); 

이 조각은 제외하고 디렉토리 핸들 D 의 모든 내용을 읽고 '.' '..'는 목록에 사용되는 것이 거의 필요 없기 때문에.

6

이 한 줄 (마지막에 '*'와일드 카드를 주)

@files = </path/to/directory/*>; 
# To demonstrate: 
print join(", ", @files); 
+0

누군가가 왜 이것이 "잘못"이라고 설명 할 수 있습니까? 깨끗하고 단순하기 때문에 (다른 솔루션과는 달리) 설명이 없어도 다운로드되었습니다. – rix0rrr

+0

globbing이 사용 된 쉘에 의존한다는 것을 읽었을 때 거의 기억하지 못했습니다. – maaartinus

+0

이것이 최고의 솔루션이며 깨끗하며 완벽하게 작동합니다. – mikemeli

1

여기 내가 쓴 디렉토리 구조 및 파일 복사 froma 백업 스크립트를 통해 재귀의 예에서, 그것을 할 것입니다.

sub copy_directory { 
my ($source, $dest) = @_; 
my $start = time; 

# get the contents of the directory. 
opendir(D, $source); 
my @f = readdir(D); 
closedir(D); 

# recurse through the directory structure and copy files. 
foreach my $file (@f) { 
    # Setup the full path to the source and dest files. 
    my $filename = $source . "\\" . $file; 
    my $destfile = $dest . "\\" . $file; 

    # get the file info for the 2 files. 
    my $sourceInfo = stat($filename); 
    my $destInfo = stat($destfile); 

    # make sure the destinatin directory exists. 
    mkdir($dest, 0777); 

    if ($file eq '.' || $file eq '..') { 
    } elsif (-d $filename) { # if it's a directory then recurse into it. 
     #print "entering $filename\n"; 
     copy_directory($filename, $destfile); 
    } else { 
     # Only backup the file if it has been created/modified since the last backup 
     if((not -e $destfile) || ($sourceInfo->mtime > $destInfo->mtime)) { 
      #print $filename . " -> " . $destfile . "\n"; 
      copy($filename, $destfile) or print "Error copying $filename: $!\n"; 
     } 
    } 
} 

print "$source copied in " . (time - $start) . " seconds.\n";  
} 
8

IO::Dir이 좋으며 묶인 해시 인터페이스도 제공합니다. perldoc을에서

:

use IO::Dir; 
$d = IO::Dir->new("."); 
if (defined $d) { 
    while (defined($_ = $d->read)) { something($_); } 
    $d->rewind; 
    while (defined($_ = $d->read)) { something_else($_); } 
    undef $d; 
} 

tie %dir, 'IO::Dir', "."; 
foreach (keys %dir) { 
    print $_, " " , $dir{$_}->size,"\n"; 
} 

그래서 당신은 같은 것을 할 수있는 :

tie %dir, 'IO::Dir', $directory_name; 
my @dirs = keys %dir; 
11

가 신속하고 더러운 솔루션이 사용하는 glob

위의 유사
@files = glob ('/path/to/dir/*'); 
+3

은'glob'가 윈도우의 경로에 공백이있을 때 예상대로 작동하지 않는다는 점에 유의할 가치가 있습니다 - http://stackoverflow.com/questions/7898496/can-not-list-directory-including-space-using-perl-in -windows-platform – Kip

+0

때때로 더러운 해결책이 잘 작동합니다. – serenesat

+0

숨겨진 파일 (점으로 시작하는 파일)도 찾지 않습니다. – josch

1

, 하지만 나는 "perldoc -f readdir"에서 가장 좋은 버전 (약간 수정)이라고 생각한다 :

opendir(DIR, $somedir) || die "can't opendir $somedir: $!"; 
@dots = grep { (!/^\./) && -f "$somedir/$_" } readdir(DIR); 
closedir DIR; 
4

당신은 DirHandle을 사용할 수

use DirHandle; 
$d = new DirHandle "."; 
if (defined $d) 
{ 
    while (defined($_ = $d->read)) { something($_); } 
    $d->rewind; 
    while (defined($_ = $d->read)) { something_else($_); } 
    undef $d; 
} 

DirHandleopendir(), closedir(), readdir()rewinddir() 기능에 대한 대안, 깨끗한 인터페이스를 제공합니다.에서

0

: http://perlmeme.org/faqs/file_io/directory_listing.html

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

my $directory = '/tmp'; 

opendir (DIR, $directory) or die $!; 

while (my $file = readdir(DIR)) { 
    next if ($file =~ m/^\./); 
    print "$file\n"; 
} 

(perldoc을 -f가 readdir에서 코드 샘플에 따라) 다음의 예는 오픈 디렉토리에서 마침표로 시작하는 모든 파일 (안 디렉토리)를 가져옵니다. 파일 이름은 @dots 배열에 있습니다.

#!/usr/bin/perl 

use strict; 
use warnings; 

my $dir = '/tmp'; 

opendir(DIR, $dir) or die $!; 

my @dots 
    = grep { 
     /^\./    # Begins with a period 
    && -f "$dir/$_" # and is a file 
} readdir(DIR); 

# Loop through the array printing out the filenames 
foreach my $file (@dots) { 
    print "$file\n"; 
} 

closedir(DIR); 
exit 0; 


closedir(DIR); 
exit 0;