2008-10-15 19 views
16

Próbuję przejść przez wszystkie podkatalogi bieżącego katalogu w Perlu i pobrać dane z tych plików. Używam grep, aby uzyskać listę wszystkich plików i folderów w danym katalogu, ale nie wiem, która z zwróconych wartości jest nazwą folderu i która jest plikiem bez rozszerzenia pliku.Jak odróżnić plik z katalogu w Perlu?

Jak mogę stwierdzić różnicę?

Odpowiedz

27

Można użyć -d operatora plik testowy, by sprawdzić, czy coś jest katalogiem. Oto niektóre z powszechnie użytecznych operatorów testowych plik

 
    -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. 

Zobacz perlfunc manual page for more

także spróbować użyć File::Find które można rekursja katalogi dla Ciebie. Oto przykład, który szuka katalogów ....

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

To działało pięknie, dzięki –

+1

Dokumentacja dla wszystkich funkcji testowych plików można znaleźć w „perldoc -f -X” (co jest dość niezrozumiałe, przyznaję). –

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

byłoby łatwiejsze w użyciu File::Find.

9

Spójrz na operatorów -X:

perldoc -f -X 

Do przechodzenia katalogów wykorzystanie pliku :: Znajdź, lub, jeśli nie jesteś masochistą, używać mój plik :: Następny moduł, który sprawia, że ​​iterator dla Ty i nie potrzebujesz szalonych callbacków. W rzeczywistości można mieć pliki zwracane przez plik :: Next ONLY i ignorować katalogi.

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 

To na http://metacpan.org/pod/File::Next

5
my @files = grep { -f } @all; 
my @dirs = grep { -d } @all; 
Powiązane problemy