错误 - 对于主目录下的所有子目录 - 在每个子目录

时间:2016-03-16 20:00:17

标签: perl

我正在尝试在一个给定目录下的每个子目录中生成单独的文件列表。这可能是一个已经解决和解决的问题,但我的具体问题是我的子目录将始终具有名称模式,并且还具有确切的数字文件,例如 -

 <**Main_Dir**>

<sub-directory>- sub1_dir with files 
    sub1.name.txt
    sub1.place.txt
    sub3.time.txt
    sub4.date.txt

<sub-directory>- sub2_dir with files 
    sub2.name.txt
    sub2.place.txt
   ..............

<sub-directory>- sub3_dir with files 
        sub3.name.txt
       ...............
       .......

有没有办法让代码循环遍历每个sub *子文件夹,因为我知道这些主文件夹的模式/名称将保持这样? 简而言之,脚本应该在每个子目录下创建一个文件,其中包含文件列表。

例如 -

<sub-directory>- sub1_dir with files 
        List_sub1_dir.txt
        sub1.name.txt
       ..............
<sub-directory>- sub2_dir with files 
        List_sub2_dir.txt
      ...............

我编辑的代码 - 它不会在子文件夹中创建任何列表文件有人可以帮我找到错误吗?非常感谢!!

    use strict;
use warnings;

use File::Find::Rule;
my $directory = './Maindir';

my @subdirs = File::Find::Rule->directory->in( $directory );

foreach my $dir (@subdirs) {
        #print "$dir\n";
        next if ($dir eq "..");

        if (-d $dir)
        {
        my @files = File::Find::Rule->file() ->name( '*.*' ) ->in( $di
+r);

        foreach my $file (@files)
                {
        open (FH,"$file");


        while (<FH>)
        {
        open FILE,">>./$dir.txt" or die $!;
        print FILE "$_";
        }
        close(FH);
        close FILE;

        #print  "$file\n";

                }


        }

2 个答案:

答案 0 :(得分:1)

我想你想要

my @files = glob './Main_dir/*/*.txt'

答案 1 :(得分:0)

正如其他人所说,File::Find是这类任务的有用模块。就个人而言,我更喜欢使用File::Find::Rule。基本上File :: Find:Rule提供了File :: Find模块的备用接口。

这是一个使用File :: Find :: Rule查找目录(及其子目录)中所有文件(带完整路径)的示例:

    $a = 0;
    for($i = $a; ; ){
        for($j = $a; ; ){
            $lim = $this->db->limit(100, $j);
            $query = $this->db->get();
            $list = $query->result();
            return $list;
            if($j >= 0) {
                break;
            }
        }
        $a = $a + 100;
    }

更新:

以上代码有拼写错误。 use strict; use warnings; use feature 'say'; use File::Find::Rule; my $dir = '/mydir'; my $rule = File::Find::Rule->new(); $rule->$file; my @files = $rule->in($dir); foreach my $file (@files) {say $file;} 行应为$rule->$file;