web-dev-qa-db-fra.com

Comment lister tous les fichiers d'un répertoire avec Perl?

Existe-t-il une fonction en Perl qui répertorie tous les fichiers et répertoires d'un répertoire? Je me souviens que Java a la File.list() pour ce faire? Existe-t-il une méthode comparable en Perl?

50
Paradius

Si vous voulez obtenir le contenu d'un répertoire donné, et seulement lui (c'est-à-dire pas de sous-répertoires), la meilleure façon est d'utiliser opendir/readdir/closedir:

opendir my $dir, "/some/path" or die "Cannot open directory: $!";
my @files = readdir $dir;
closedir $dir;

Vous pouvez aussi utiliser:

my @files = glob( $dir . '/*' );

Mais à mon avis, ce n'est pas aussi bon - principalement parce que glob est une chose assez complexe (peut filtrer les résultats automatiquement) et l'utiliser pour obtenir tous les éléments du répertoire semble être une tâche trop simple.

D'un autre côté, si vous avez besoin d'obtenir du contenu de tous les répertoires et sous-répertoires, il existe essentiellement une solution standard:

use File::Find;

my @content;
find( \&wanted, '/some/path');
do_something_with( @content );

exit;

sub wanted {
  Push @content, $File::Find::name;
  return;
}
82
user80168

readdir () fait cela.

Vérifiez http://perldoc.Perl.org/functions/readdir.html

opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
@dots = grep { /^\./ && -f "$some_dir/$_" } readdir(DIR);
closedir DIR;
12
Vinko Vrsalovic

cela devrait le faire.

my $dir = "bla/bla/upload";
opendir DIR,$dir;
my @dir = readdir(DIR);
close DIR;
foreach(@dir){
    if (-f $dir . "/" . $_ ){
        print $_,"   : file\n";
    }elsif(-d $dir . "/" . $_){
        print $_,"   : folder\n";
    }else{
        print $_,"   : other\n";
    }
}
11
Matthew Vines

Ou File :: Find

use File::Find;
finddepth(\&wanted, '/some/path/to/dir');
sub wanted { print };

Il passera par des sous-répertoires s'ils existent.

11
Todd Gardner

Si vous êtes un fainéant comme moi, vous aimerez peut-être utiliser le module File :: Slurp . La fonction read_dir lit le contenu du répertoire dans un tableau, supprime les points et, si nécessaire, préfixe les fichiers renvoyés avec le dir pour les chemins absolus

my @paths = read_dir( '/path/to/dir', prefix => 1 ) ;
3
Matthew Lock

Cela répertoriera tout (y compris les sous-répertoires) du répertoire que vous spécifiez, dans l'ordre et avec les attributs. J'ai passé des jours à chercher quelque chose pour le faire, et j'ai pris part à toute cette discussion, et un peu à moi, et je l'ai monté. PRENDRE PLAISIR!!

#!/usr/bin/Perl --
print qq~Content-type: text/html\n\n~;
print qq~<font face="arial" size="2">~;

use File::Find;

# find( \&wanted_tom, '/home/thomas/public_html'); # if you want just one website, uncomment this, and comment out the next line
find( \&wanted_tom, '/home');
exit;

sub wanted_tom {
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat ($_);
$mode = (stat($_))[2];
$mode = substr(sprintf("%03lo", $mode), -3);

if (-d $File::Find::name) {
print "<br><b>--DIR $File::Find::name --ATTR:$mode</b><br>";
 } else {
print "$File::Find::name --ATTR:$mode<br>";
 }
  return;
}
2
user186884