2008-08-22 15 views

答えて

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

EDIT:ああ、申し訳ありませんが、「配列に」の部分を逃した:

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()トンを通じてreaddir()から返されたリストを渡していますhatはファイル(ディレクトリ、デバイス、名前付きパイプなどとは対照的に)であり、ドットで始まらない値(リスト名@dotsを誤解を招く)を返すだけですが、それは彼がコピーしたときの変更によるものですreaddir()のドキュメントを参照してください)。それは返されるディレクトリの内容を制限するので、私はそれが技術的にこの質問に対する正しい答えだとは思わないが、ファイル名をフィルタリングするために使用される一般的なイディオムを示しており、文書化する価値があると思った。たくさん見てもう一つの例は次のとおりです。

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

このスニペットは以外のディレクトリハンドルD からすべての内容を読み取り「」 '..'のように表示されることはほとんどありません。

6

これは、1つの行(末尾の「*」ワイルドカードを注意してください)

@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"; 
} 

ようなので、あなたが何かをすることができます:迅速かつ汚いソリューションは、上記と同様にglob

@files = glob ('/path/to/dir/*'); 
11

私は最高のバージョンが "perldoc -f readdir"から(わずかに変更されている)と思う:

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

は 'glob'がWindows上のパスにスペースを入れても期待通りに動作しないことに気付く価値がある - http://stackoverflow.com/questions/7898496/can-not-list-directory-including-space-using-perl-in -windows-platform – Kip

+0

時には汚れた解決策がうまく動作します。 – serenesat

+0

これは隠しファイル(ドットで始まるファイル)も見つけられません。 – josch

1

を使用することです

tie %dir, 'IO::Dir', $directory_name; 
my @dirs = keys %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; 
関連する問題