2009-06-25 4 views

답변

65

당신은 주어진 디렉토리의 내용을 얻고 싶은 경우에, 단지 그것 (즉 하위 디렉토리), 가장 좋은 방법은 사용하는 것입니다했던 opendir/readdir은/closedir :

opendir my $dir, "/some/path" or die "Cannot open directory: $!"; 
my @files = readdir $dir; 
closedir $dir; 

은 또한 사용할 수 있습니다

my @files = glob($dir . '/*'); 

내 견해로는 글로브가 꽤 복잡하지 않기 때문에 (주로 결과를 자동으로 필터링 할 수 있음) 매우 복잡한 작업이므로 디렉터리의 모든 요소를 ​​얻는 것이 너무 간단한 작업으로 보입니다. 당신이 디렉토리 및 하위 디렉토리의 모든 컨텐츠를 취득해야하는 경우 반면에

는 기본적으로 하나 개의 표준 솔루션이 :

use File::Find; 

my @content; 
find(\&wanted, '/some/path'); 
do_something_with(@content); 

exit; 

sub wanted { 
    push @content, $File::Find::name; 
    return; 
} 
+0

나는 항상 readdir이 단지 전체 경로가 아닌 상대적인 파일명의 목록을 반환한다는 것을 잊어 버립니다! –

+0

이 작업을 위해 globbing을 사용하지 않으셔서 감사합니다. 이것에 대한 globbing 사용의 또 다른 단점은 숨겨진 파일 (점으로 시작하는 파일)을 찾지 못한다는 것입니다. – josch

9

이 작업을 수행해야합니다.

my $dir = "bla/bla/upload"; 
opendir DIR,$dir; 
my @dir = readdir(DIR); 
close DIR; 
foreach(@dir){ 
    if (-f $dir . "/" . $_){ 
     print $_," : file\n"; 
    }elsif(-d $dir . "/" . $_){ 
     print $_," : folder\n"; 
    }else{ 
     print $_," : other\n"; 
    } 
} 
+1

당신이했던 opendir (실패했던 opendir 확인 ... 또는 "오류 메시지를 죽게 : $! "). 또한, 나는 무엇인가 놓치고 있냐? Win32 :: GUI :: DoEvents()는 무엇을하고 있습니까? (나는 그 질문에 관련된 어떤 것도 보지 못한다.) – Telemachus

+0

이것은 내가하기 싫은, 또는 쉽게 할 수있는 무언가를위한 정규 표현식을 기억하고 싶지 않은 가장 좋은 방법이다. 나는 이것을 list ($ dir ,"에프"); 파일 "d"를 디렉토리로 보내 주셔서 감사합니다. – Geomorillo

11

또는 File::Find

use File::Find; 
finddepth(\&wanted, '/some/path/to/dir'); 
sub wanted { print }; 

존재하는 경우 그것은 하위 디렉토리를 통해 이동합니다.

2

이 모든 (하위 디렉토리 포함)가 나열됩니다 디렉토리에서 당신 순서대로, 그리고 특성과 함께 지정하십시오. 나는 이것을하기 위해 무언가를 찾고 며칠을 보냈고, 나는 전체 토론에서 그리고 나 자신의 일부를 가져다가 함께 정리했다. 즐겨!!

#!/usr/bin/perl -- 
print qq~Content-type: text/html\n\n~; 
print qq~<font face="arial" size="2">~; 

use File::Find; 

# find(\&wanted_tom, '/home/thomas/public_html'); # if you want just one website, uncomment this, and comment out the next line 
find(\&wanted_tom, '/home'); 
exit; 

sub wanted_tom { 
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat ($_); 
$mode = (stat($_))[2]; 
$mode = substr(sprintf("%03lo", $mode), -3); 

if (-d $File::Find::name) { 
print "<br><b>--DIR $File::Find::name --ATTR:$mode</b><br>"; 
} else { 
print "$File::Find::name --ATTR:$mode<br>"; 
} 
    return; 
} 
+3

아하, 내 눈! – javs

3

당신이 나를 좋아하는 사람이라면 File::Slurp 모듈을 사용하는 것이 좋습니다. read_dir 기능의 의지는, 배열에 디렉토리 내용을 읽어 점을 제거하고, 필요한 접두사 파일이 절대 경로

에 대한 디렉토리와 함께 반환하는 경우
my @paths = read_dir('/path/to/dir', prefix => 1) ; 
관련 문제