如何使用Perl列出目录中的所有文件?

时间:2009-06-25 19:33:41

标签: perl directory

Perl中是否有一个列出目录中所有文件和目录的函数? 我记得Java有File.list()这样做吗?在Perl中是否有类似的方法?

6 个答案:

答案 0 :(得分:79)

如果你想获得给定目录的内容,只有它(即没有子目录),最好的方法是使用opendir / readdir / closedir:

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

您也可以使用:

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

但是在我看来它并不是那么好 - 主要是因为glob非常复杂(可以自动过滤结果)并使用它来获取目录的所有元素似乎是一个太简单的任务。

另一方面,如果您需要从所有目录和子目录获取内容,基本上有一个标准解决方案:

use File::Find;

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

exit;

sub wanted {
  push @content, $File::Find::name;
  return;
}

答案 1 :(得分:12)

readdir()就是这么做的。

检查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;

答案 2 :(得分:11)

这应该这样做。

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";
    }
}

答案 3 :(得分:11)

File::Find

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

如果子目录存在,它将通过子目录。

答案 4 :(得分:3)

如果你像我一样懒散,你可能想使用File::Slurp模块。 read_dir函数将目录内容读入数组,删除点,如果需要,用绝对路径的dir返回的文件前缀

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

答案 5 :(得分:2)

这将按顺序列出您指定的目录中的所有内容(包括子目录),并使用属性。我花了好几天时间寻找能够做到这一点的事情,并且从整个讨论中获取了部分内容,并将其作为我自己的一部分,并将其整合在一起。享受!!

#!/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;
}