2010-01-27 16 views
24

Eventuali duplicati:
How can I list all of the files in a directory with Perl?Come posso eseguire il loop dei file in una directory in Perl?

voglio scorrere a poche centinaia di file che sono tutti contenuti nella stessa directory. Come lo farei in Perl?

+1

Questa domanda non è una copia di questa? http://stackoverflow.com/questions/1045792/how-can-i-list-all-of-the-files-in-a-directory-with-perl –

+1

@Leonardo Herrera Infatti, lo è. Scusa, non me lo ricordavo. Voto per chiudere. –

+0

Non vedo come questo è un duplicato. La domanda chiede come eseguire il loop dei file in una directory. Il 'duplicato' contrassegnato chiede come elencare tutti i file in una directory. Chiaramente diverso. Perché contrassegnare come duplicato? – CJ7

risposta

13

È possibile utilizzare readdir o glob.

In alternativa, è possibile utilizzare un modulo come ad esempio Path::Class:

Ordinariamente children() non includere le voci indipendenti e genitore. e .. (o i loro equivalenti su sistemi non Unix), perché è come se fossi un mio nonno. Se si vuole tutte le voci della rubrica telefonica tra questi quelli speciali, passare un vero valore per il parametro all:

@c = $dir->children(); # Just the children 
@c = $dir->children(all => 1); # All entries 

Inoltre, c'è un parametro no_hidden che escluderà tutte le voci normalmente "nascosti" - su Unix questo significa esclusione tutte le voci che iniziano con un punto (.):

@c = $dir->children(no_hidden => 1); # Just normally-visible entries 

Oppure, Path::Tiny:

@paths = path("/tmp")->children; 
@paths = path("/tmp")->children(qr/\.txt$/); 

Restituisce un elenco di oggetti Path::Tiny per tutti i file e le directory in una directory. Esclude "." e ".." automaticamente.

Se viene fornito un argomento opzionale qr//, restituisce solo oggetti per nomi figlio che corrispondono all'espressione regolare specificata. il nome di base viene utilizzato solo per la corrispondenza:

@paths = path("/tmp")->children(qr/^foo/); 
# matches children like the glob foo* 

Ottenere l'elenco delle voci di directory in un array rifiuti po 'di memoria (invece di ottenere nome di un file alla volta), ma con solo poche centinaia di file , è improbabile che questo sia un problema.

Path::Class è portatile per sistemi operativi diversi da * nix e Windows. D'altra parte, AFAIK, le sue istanze utilizzano più memoria delle istanze Path::Tiny.

Se la memoria è un problema, è meglio usare readdir in un ciclo while.

+0

e rimuovi reead_dir. e .. per te, e se necessario, puoi anteporre la directory al nome file –

43
#!/usr/bin/perl -w 

@files = <*>; 
foreach $file (@files) { 
    print $file . "\n"; 
} 

Dove

@files = <*>; 

può essere

@files = </var/www/htdocs/*>; 
@files = </var/www/htdocs/*.html>; 

ecc

+0

Questo non elenca i file nascosti (quelli che iniziano con un punto) su GNU/Linux e probabilmente altri sistemi operativi simili. – josch

17

godere.

opendir(DH, "directory"); 
my @files = readdir(DH); 
closedir(DH); 

foreach my $file (@files) 
{ 
    # skip . and .. 
    next if($file =~ /^\.$/); 
    next if($file =~ /^\.\.$/); 

    # $file is the file used on this iteration of the loop 
} 
+1

grazie! Userò 'next if ($ file = ~ /^.+$/);' comunque, per evitare la seconda affermazione;). – ashraf

+0

regex @ashraf deve essere /^\.+$/ invece di /^.+$/ – Rauf

+0

@Rauf si penso che tu abbia ragione! :) – ashraf

Problemi correlati