Frage

Ich versuche durch alle Unterverzeichnisse des aktuellen Verzeichnisses in Perl zu durchqueren, und Daten aus diesen Dateien. Ich verwende grep eine Liste aller Dateien und Ordner im angegebenen Verzeichnis zu bekommen, aber ich weiß nicht, welche der zurückgegebenen Werte ein Ordnername ist und das ist eine Datei ohne Dateiendung.

Wie kann ich den Unterschied?

War es hilfreich?

Lösung

Sie können einen -d Dateitestoperator zu überprüfen, ob etwas ein Verzeichnis ist. Hier einige der häufig nützlichen Datei Test Operatoren

    -e  File exists.
    -z  File has zero size (is empty).
    -s  File has nonzero size (returns size in bytes).
    -f  File is a plain file.
    -d  File is a directory.
    -l  File is a symbolic link.

Siehe perlfunc Manpage für mehr

Versuchen Sie auch, mit File :: Find , welche Verzeichnisse für Sie Rekursion können. Hier ist eine Probe, die für Verzeichnisse aussieht ....

sub wanted {
     if (-d) { 
         print $File::Find::name." is a directory\n";
     }
}

find(\&wanted, $mydir);

Andere Tipps

print "$file is a directory\n" if ( -d $file );

Schauen Sie sich die -X Operatoren:

perldoc -f -X

Für Directory-Traversal, Datei verwenden :: finden, oder, wenn Sie kein Masochist sind, verwenden Sie mein File :: Next-Modul, das für Sie einen Iterator macht und erfordert nicht verrückt Rückrufe. In der Tat können Sie Datei haben :: Next nur Dateien zurück und ignorieren Verzeichnisse.

use File::Next;

my $iterator = File::Next::files( '/tmp' );

while ( defined ( my $file = $iterator->() ) ) {
    print $file, "\n";
}

# Prints...
/tmp/foo.txt
/tmp/bar.pl
/tmp/baz/1
/tmp/baz/2.txt
/tmp/baz/wango/tango/purple.txt

Es ist unter http://metacpan.org/pod/File::Next

my @files = grep { -f } @all;
my @dirs = grep { -d } @all;
my $dh = opendir(".");
my @entries = grep !/^\.\.?$/, readdir($dh);
closedir $dh;

foreach my $entry (@entries) {
    if(-f $entry) {
        # $entry is a file
    } elsif (-d $entry) {
        # $entry is a directory
    }
}

Es wäre einfacher, File::Find zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top