如何使用Perl在具有特定名称模式的目录下列出文件?

时间:2009-11-10 12:44:01

标签: perl directory

我有一个目录/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

但是不能按我需要的方式工作。

6 个答案:

答案 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