我有一个目录/var/spool
,里面有名为
a b c d e f g h i j k l m n o p q r s t u v x y z
在每个“信件目录”中,一个名为“user
”的目录,在其中,有许多目录名为auser1
auser2
auser3
auser4
{{ 1}} ...
每个用户目录都包含邮件消息,文件名格式如下:2. 3. 4. 5.等。
如何以下列方式列出每个目录中每个用户的电子邮件文件:
/var/spool/a/user/auser1/11. /var/spool/a/user/auser1/9. /var/spool/a/user/auser1/8. /var/spool/a/user/auser1/10. /var/spool/a/user/auser1/2. /var/spool/a/user/auser1/4. /var/spool/a/user/auser1/12. /var/spool/b/user/buser1/12. /var/spool/b/user/buser1/134. /var/spool/b/user/buser1/144.
等
我需要这些文件,然后打开每个文件以修改标题和正文。这部分我已经有了,但我需要第一部分。
我正在尝试这个:
auser5
但是不能按我需要的方式工作。
答案 0 :(得分:3)
您可以使用File::Find。
答案 1 :(得分:2)
使用File::Find遍历目录树。
答案 2 :(得分:2)
正如其他人所说,使用File::Find:
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
find(\&find_emails => '/var/spool');
sub find_emails {
return unless /\A[0-9]+[.]\z/;
return unless -f $File::Find::name;
process_an_email($File::Find::name);
return;
}
sub process_an_email {
my ($file) = @_;
print "Processing '$file'\n";
}
答案 3 :(得分:2)
人们不断推荐File :: Find,但另一件让我很容易的就是我的File::Find::Closures,它为您提供了便利功能:
use File::Find;
use File::Find::Closures qw( find_by_regex );
my( $wanted, $reporter ) = find_by_regex( qr/^\d+\.\z/ );
find( $wanted, @directories_to_search );
my @files = $reporter->();
您甚至不需要使用File::Find::Closures
。我编写了模块,以便您可以取出所需的子程序并将其粘贴到您自己的代码中,或者调整它以获得您需要的内容。
答案 4 :(得分:1)
对于固定级别的目录,有时使用glob比使用File :: Find更容易:
while (my $file = </var/spool/[a-z]/user/*/*>) {
print "Processing $file\n";
}
答案 5 :(得分:-1)
试试这个:
sub browse($);
sub browse($)
{
my $path = $_[0];
#append a / if missing
if($path !~ /\/$/)
{
$path .= '/';
}
#loop through the files contained in the directory
for my $eachFile (glob($path.'*'))
{
#if the file is a directory
if(-d $eachFile)
{
#browse directory recursively
browse($eachFile);
}
else
{
# your file processing here
}
}
}#browse