Duplicata possible:
Comment puis-je lister tous les fichiers d'un répertoire avec Perl?
Je veux parcourir quelques centaines de fichiers qui sont tous contenus dans le même répertoire. Comment pourrais-je faire cela en Perl?
#!/usr/bin/Perl -w
my @files = <*>;
foreach my $file (@files) {
print $file . "\n";
}
Où
@files = <*>;
peut être
@files = </var/www/htdocs/*>;
@files = </var/www/htdocs/*.html>;
etc.
Prendre plaisir.
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
}
Vous pouvez utiliser readdir ou glob .
Ou, vous pouvez utiliser un module tel que Path :: Class :
Normalement,
children()
n'inclura pas les entrées self et parent. et .. (ou leurs équivalents sur les systèmes non-Unix), parce que c'est comme si j'étais mon propre grand-père. Si vous voulez toutes les entrées du répertoire, y compris celles-ci, transmettez une valeur vraie pour le paramètre all:@c = $dir->children(); # Just the children @c = $dir->children(all => 1); # All entries
De plus, il y a un paramètre no_hidden qui exclura toutes les entrées normalement "cachées" - sur Unix cela signifie exclure toutes les entrées qui commencent par un point (
.
):
@c = $dir->children(no_hidden => 1); # Just normally-visible entries
Ou, Path :: Tiny :
@paths = path("/tmp")->children; @paths = path("/tmp")->children( qr/\.txt$/ );
Renvoie une liste de
Path::Tiny
objets pour tous les fichiers et répertoires d'un répertoire. Exclut"."
et".."
automatiquement.Si une option
qr//
L'argument est fourni, il ne renvoie que les objets pour les noms d'enfants qui correspondent à l'expression régulière donnée. Seul le nom de base est utilisé pour la correspondance:
@paths = path("/tmp")->children( qr/^foo/ );
# matches children like the glob foo*
Obtenir la liste des entrées de répertoire dans un tableau gaspille de la mémoire (par opposition à obtenir un nom de fichier à la fois), mais avec seulement quelques centaines de fichiers, il est peu probable que ce soit un problème.
Path::Class
est portable sur les systèmes d'exploitation autres que * nix et Windows. D'un autre côté, AFAIK, ses instances utilisent plus de mémoire que Path::Tiny
instances.
Si la mémoire est un problème, il vaut mieux utiliser readdir
dans une boucle while
.