【发布时间】:2023-03-28 04:17:01
【问题描述】:
Perl 中有一个函数可以列出目录中的所有文件和目录吗?
我记得Java有File.list()来做这个? Perl 中有类似的方法吗?
【问题讨论】:
Perl 中有一个函数可以列出目录中的所有文件和目录吗?
我记得Java有File.list()来做这个? Perl 中有类似的方法吗?
【问题讨论】:
如果你想获取给定目录的内容,并且只有它(即没有子目录),最好的方法是使用 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;
}
【讨论】:
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;
【讨论】:
应该这样做。
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";
}
}
【讨论】:
use File::Find;
finddepth(\&wanted, '/some/path/to/dir');
sub wanted { print };
如果存在子目录,它将通过子目录。
【讨论】:
如果你像我一样懒惰,你可能会喜欢使用File::Slurp 模块。 read_dir 函数会将目录内容读入一个数组,删除点,如果需要的话,为返回的文件加上绝对路径的 dir 前缀
my @paths = read_dir( '/path/to/dir', prefix => 1 ) ;
【讨论】:
这将按顺序和属性列出您指定的目录中的所有内容(包括子目录)。我花了几天的时间寻找可以做这件事的东西,我参与了整个讨论的一部分,还有一点我自己的,然后把它们放在一起。尽情享受吧!
#!/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;
}
【讨论】: