2008-08-22 27 views

cevap

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

DÜZENLEME: Pardon, "bir diziye" bölümünü cevapsız:

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: diğer cevapların çoğu geçerlidir, ancak ben, özellikle this answer yorum istedim hangi Bu çözüm sunulmaktadır:

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

Birincisi, afiş yoktu çünkü ne yaptığını belgelemek için: bir grep() t aracılığıyla readdir() döndü liste geçiriyor şapka dosyaları (dizinler, aygıtlar, adlandırılmış yöneltmeler, vb. aksine) olan ve bir nokta ile başlamıyor olan değerleri döndürür (bu, liste adını @dots'u yanıltıcı kılar; ancak bu, kopyalama sırasında yaptığı değişiklikten kaynaklanır) readdir() belgelerinden). Geri döndüğü dizinin içeriğini sınırladığı için, teknik olarak bu soruya doğru bir cevap olduğunu düşünmüyorum, ancak dosya adlarını Perl içinde filtrelemek için kullanılan yaygın bir deyimi gösterir ve belgenin değerli olacağını düşündüm. çok görülen bir diğer örneği:

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

Bu pasajı hariç dizin kolu D tüm içeriğini okur. '' ve '..', çünkü bu listede çok nadiren aranıyor.

6

Bu bir satırda (sonunda '*' joker dikkat)

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

Birisi bana bunun neden "yanlış" olduğunu açıklayabilir mi? Çünkü temiz ve basittir (bazı diğer çözümlerin aksine), ancak açıklama yapılmaksızın aşağı çekilmiştir. – rix0rrr

+0

Örtücülüğün kullanılan kabuğa bağımlı olduğunu okuduğunu neredeyse hatırlıyorum, belki de bu yüzden. – maaartinus

+0

Bu en iyi çözüm, temiz ve benim için mükemmel çalıştı. – mikemeli

1

İşte yazdığım bir dizin yapısı ve kopyalama dosyaları froma yedekleme komut dosyası aracılığıyla recursing bir örnek de, bunu yapacağız.

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 güzel ve aynı zamanda bir bağladılar karma arayüz sağlar. perldoc itibaren

:

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

Yani böyle bir şey yapabileceğini:

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

Hızlı ve kirli çözüm kullanmak glob

yukarıdaki benzer
@files = glob ('/path/to/dir/*'); 
+3

, "glob" penceresindeki yollarda beklendiği gibi çalışmadığına dikkat çekiyor - http://stackoverflow.com/questions/7898496/can-not-list-directory-including-space-using-perl-in -windows-platform – Kip

+0

bazen kirli çözümler iyi çalışıyor. – serenesat

+0

Bu ayrıca gizli dosyaları (nokta ile başlayanlar) da bulamayacaktır. – josch

1

, ama bence en iyi sürüm "perldoc -f readdir" den (biraz değiştirilmiş):

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

Sen DirHandle kullanabilirsiniz:

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() ve rewinddir() işlevlerine alternatif, daha temiz bir arayüz sağlar.dan

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 bir kod örneği temel) Aşağıdaki örnek açık dizinden bir süre ile başlayan tüm dosyaları (değil dizinleri) alır. Dosya adları @dots dizisinde bulunur.

#!/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; 
İlgili konular