39 Stimmen

Wie lese ich den Inhalt eines Verzeichnisses in Perl ein?

Wie bringe ich Perl dazu, den Inhalt eines bestimmten Verzeichnisses in ein Array einzulesen?

Backticks kann dies tun, aber gibt es eine Methode, die "scandir" oder einen ähnlichen Begriff verwendet?

1voto

Mickey Punkte 646

Hier ein Beispiel für das Durchsuchen einer Verzeichnisstruktur und das Kopieren von Dateien aus einem von mir geschriebenen Sicherungsskript.

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

1voto

trjh Punkte 161

Ähnlich wie oben, aber ich denke, die beste Version ist (leicht modifiziert) von "perldoc -f readdir":

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

1voto

Shawn Punkte 37109

Sie können auch die children Methode aus dem beliebten Path::Tiny Modul:

use Path::Tiny;
my @files = path("/path/to/dir")->children;

Dies erzeugt ein Array von Path::Tiny Objekte, die oft nützlicher sind als nur Dateinamen, wenn man etwas mit den Dateien machen will, aber nur die Namen braucht:

my @files = map { $_->stringify } path("/path/to/dir")->children;

0voto

Luke Fowler Punkte 73

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

Das folgende Beispiel (basierend auf einem Codebeispiel aus perldoc -f readdir) holt alle Dateien (nicht Verzeichnisse), die mit einem Punkt beginnen, aus dem geöffneten Verzeichnis. Die Dateinamen werden in dem Array @dots gefunden.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X