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

bwleehnv  于 2022-12-19  发布在  Perl
关注(0)|答案(6)|浏览(225)

我有一个目录/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“的目录,在这个里面,有很多叫auser1auser2auser3auser4auser5的目录...
每个用户目录都包含邮件,文件名具有以下格式: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.

等等。
我需要的文件,然后打开每一个单独的文件修改头和身体。这部分我已经有了,但我需要的第一部分。
我正在尝试这个:

dir = "/var/spool";

opendir ( DIR, $dir ) || die "No pude abrir el directorio $dirname\n";
while( ($filename = readdir(DIR))){
    @directorios1 = `ls -l "$dir/$filename"`;
    print("@directorios1\n");
}
closedir(DIR);

但并不符合我的需要。

tkclm6bt

tkclm6bt2#

正如其他人所指出的,使用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";
}
new9mtju

new9mtju4#

对于固定级别的目录,有时使用glob比使用File::Find:

while (my $file = </var/spool/[a-z]/user/*/*>) {
  print "Processing $file\n";
}
nafvub8i

nafvub8i5#

人们一直在推荐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,我编写这个模块是为了让你可以提取出你想要的子例程,并将它粘贴到你自己的代码中,也许可以调整它以获得你所需要的。

a0x5cqrl

a0x5cqrl6#

试试这个:

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

相关问题