如何循环遍历 Perl 目录中的文件? [复制]
Posted
技术标签:
【中文标题】如何循环遍历 Perl 目录中的文件? [复制]【英文标题】:How can I loop through files in a directory in Perl? [duplicate] 【发布时间】:2011-01-10 02:23:05 【问题描述】:可能重复:How can I list all of the files in a directory with Perl?
我想遍历几百个文件,这些文件都包含在同一个目录中。我将如何在 Perl 中执行此操作?
【问题讨论】:
这个问题不是和这个问题重复的吗? ***.com/questions/1045792/… @Leonardo Herrera 确实如此。抱歉,我不记得那个了。投票结束。 我看不出这是怎么复制的。该问题询问如何遍历目录中的文件。标记的“重复”询问如何列出目录中的所有文件。明显不同。为什么要标记为重复? 【参考方案1】:#!/usr/bin/perl -w
my @files = <*>;
foreach my $file (@files)
print $file . "\n";
在哪里
@files = <*>;
可以
@files = </var/www/htdocs/*>;
@files = </var/www/htdocs/*.html>;
等等
【讨论】:
这不会列出 GNU/Linux 和可能其他类似操作系统上的隐藏文件(以点开头的文件)。【参考方案2】:享受吧。
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
【讨论】:
谢谢!不过,我会使用next if ($file =~ /^.+$/);
,以避免第二条语句;)。
@ashraf 正则表达式必须是 /^\.+$/ 而不是 /^.+$/
@Rauf 是的,我认为你是对的! :)【参考方案3】:
您可以使用readdir 或glob。
或者,您可以使用Path::Class等模块:
通常
children()
将不包括自我和父条目。和..(或它们在非 Unix 系统上的等价物),因为这就像我是我自己的祖父企业。如果您确实需要所有目录条目,包括这些特殊条目,请为 all 参数传递一个 true 值:@c = $dir->children(); # Just the children @c = $dir->children(all => 1); # All entries
此外,还有一个 no_hidden 参数将排除所有通常“隐藏”的条目 - 在 Unix 上,这意味着排除所有以点开头的条目 (
.
):
@c = $dir->children(no_hidden => 1); # Just normally-visible entries
或者,Path::Tiny:
@paths = path("/tmp")->children; @paths = path("/tmp")->children( qr/\.txt$/ );
返回目录中所有文件和目录的
Path::Tiny
对象列表。自动排除"."
和".."
。如果提供了可选的
qr//
参数,它只返回与给定正则表达式匹配的子名称的对象。仅使用基本名称进行匹配:
@paths = path("/tmp")->children( qr/^foo/ );
# matches children like the glob foo*
将目录条目列表放入一个数组会浪费一些内存(与一次只获得一个文件名相反),但只有几百个文件,这不太可能成为问题。
Path::Class
可移植到 *nix 和 Windows 以外的操作系统。另一方面,AFAIK,它的实例比Path::Tiny
实例使用更多的内存。
如果内存是个问题,最好在while
循环中使用readdir
。
【讨论】:
和 reead_dir 删除 .和 .. 为您服务,如果需要,可以将目录添加到文件名中以上是关于如何循环遍历 Perl 目录中的文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在linux中使用shell脚本遍历指定目录的文件,将创建时间大于指定时间的文件,复制到指定目录下。