2008-10-15 6 views
16

Ich versuche, durch alle Unterverzeichnisse des aktuellen Verzeichnisses in Perl zu gehen und Daten von diesen Dateien zu erhalten. Ich verwende grep, um eine Liste aller Dateien und Ordner in dem angegebenen Verzeichnis zu erhalten, aber ich weiß nicht, welcher der zurückgegebenen Werte ein Ordnername ist und welche eine Datei ohne Dateierweiterung ist.Wie kann ich eine Datei von einem Verzeichnis in Perl unterscheiden?

Wie kann ich den Unterschied feststellen?

Antwort

27

Sie einen Operator -d Datei Test können Sie überprüfen, ob etwas ein Verzeichnis ist. Hier einige der häufig nützliche 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 manual page for more

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

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

find(\&wanted, $mydir); 
20
print "$file is a directory\n" if (-d $file); 
+0

Dieses wunderschön gearbeitet, dank –

+1

Die Dokumentation für alle Dateitestfunktionen können mit „perldoc -f -X“ zu finden (was recht ist nicht intuitiv, ich gebe es zu). –

4
 
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 
    } 
} 
2

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

9

Schauen Sie sich die -X Operatoren:

perldoc -f -X 

Für Directory-Traversal, use File :: Find, oder, wenn Sie kein Masochist sind, meine Datei verwenden :: Next-Modul, das für einen Iterator macht Sie brauchen keine verrückten Rückrufe. Sie können File :: Next NUR Dateien zurückgeben und Verzeichnisse ignorieren.

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 bei http://metacpan.org/pod/File::Next

5
my @files = grep { -f } @all; 
my @dirs = grep { -d } @all; 
Verwandte Themen