如何使用Perl列出目录中的所有文件?
我通常使用类似如何使用Perl列出目录中的所有文件?,perl,directory,Perl,Directory,我通常使用类似 my $dir="/path/to/dir"; opendir(DIR, $dir) or die "can't open $dir: $!"; my @files = readdir DIR; closedir DIR; 或者有时我使用glob,但无论如何,我总是需要添加一两行来过滤和。这很烦人。 你通常是如何完成这项普通任务的 my @files = grep {!/^\./} readdir DIR; 这也将排除所有的点文件,但这通常是您想要的。如果某些点文件很重要 m
my $dir="/path/to/dir";
opendir(DIR, $dir) or die "can't open $dir: $!";
my @files = readdir DIR;
closedir DIR;
或者有时我使用glob
,但无论如何,我总是需要添加一两行来过滤
和。
这很烦人。
你通常是如何完成这项普通任务的
my @files = grep {!/^\./} readdir DIR;
这也将排除所有的点文件,但这通常是您想要的。如果某些点文件很重要
my @files = grep !/^\.\.?$/, readdir DIR;
将仅排除
和。
我通常使用全局方法:
for my $file (glob "$dir/*") {
#do stuff with $file
}
除非目录中有很多文件,否则这种方法可以正常工作。在这些情况下,您必须在循环中切换回readdir
(将readdir
放入列表上下文与glob
一样糟糕):
但通常,如果我正在读取目录中的一组文件,我希望以递归方式读取它们。在这些情况下,我使用File::Find
:
use File::Find;
find sub {
return if /^[.]/;
#do stuff with $_ or $File::Find::name
}, $dir;
当我只需要文件(而不是目录)时,我使用grep
和-f
测试:
my @files = grep { -f } readdir $dir;
我经常使用。好处包括:(1)如果目录不存在,则自动死亡。(2) 默认情况下排除
和。
。它的行为类似于readdir
,因为它不返回完整路径
use File::Slurp qw(read_dir);
my $dir = '/path/to/dir';
my @contents = read_dir($dir);
另一个有用的模块是,它在读取目录时提供了许多选项。例如:
use File::Util;
my $dir = '/path/to/dir';
my $fu = File::Util->new;
my @contents = $fu->list_dir( $dir, '--with-paths', '--no-fsdots' );
谢谢克里斯和埃瑟的推荐。我使用以下命令将所有文件(排除的目录)的列表从引用当前目录以外的目录的目录句柄读取到数组中。当不使用grep语句中的绝对路径时,数组总是缺少一个文件
use File::Slurp;
print "\nWhich folder do you want to replace text? " ;
chomp (my $input = <>);
if ($input eq "") {
print "\nNo folder entered exiting program!!!\n";
exit 0;
}
opendir(my $dh, $input) or die "\nUnable to access directory $input!!!\n";
my @dir = grep { -f "$input\\$_" } readdir $dh;
使用File::Slurp;
打印“\n要替换哪个文件夹的文本?”;
chomp(我的$input=);
如果($input eq“”){
打印“\n没有文件夹进入退出程序!!!\n”;
出口0;
}
opendir(我的$dh,$input)或die“\n无法访问目录$input!!!\n”;
my@dir=grep{-f“$input\\\$\”readdir$dh;
从大量的响应中,您可以看到这完全取决于您想要得到什么结果。:)的可能重复。这仅在目录句柄用于当前目录时才起作用。@Chris:好的,首先需要chdir,或者在grep中使用File::Spec->catfile($dirname,$\ux)构造一个绝对路径名
…这不是OP的要求。他只想过滤掉
和。
。很好。我可以让它返回完整的路径(不是基本名称)吗?@ David B You也可以考虑<代码>文件::Util < />代码,如编辑的答案所示。并不是说我希望那个文件名出现在任何人身上,而是人们会做一些奇怪的事情,看看是否有人会忽略他们偷偷溜进你的目录中的一个文件。你可以用一个\z而不是$:)来解决这个问题。[.]
的用法很奇怪---为什么你更喜欢它而不是\.
?@Chris Jester Young我更喜欢它。它似乎没有那么吵(见)。同样,这也是合理化的,正则表达式中的转义往往意味着“下一个字符做了一些特殊的事情”(例如,\x{2e}
),但\.
意味着它只是一个句点。由于大多数字符在字符类中没有特殊意义,因此它是一种很好的转义机制。
use File::Slurp;
print "\nWhich folder do you want to replace text? " ;
chomp (my $input = <>);
if ($input eq "") {
print "\nNo folder entered exiting program!!!\n";
exit 0;
}
opendir(my $dh, $input) or die "\nUnable to access directory $input!!!\n";
my @dir = grep { -f "$input\\$_" } readdir $dh;