如何遍历目录和子目录中的所有文件

时间:2013-07-11 08:54:22

标签: perl

我正在编写一个脚本,它将读取文件并根据文件内容重新命名文件。

我面临的问题:

1我无法读取子目录中的文件。 第二,我正在尝试重命名该文件,但发生了错误。

这是我的代码:

               Folder Structur : 
                       Logs
                      / / / \
                     a  b c  d
                   / \ \
                  e file file

其中a,b,c,d,e为dir        文件,文件是txt文件

#!/usr/bin/perl 
use strict;
use warnings;
use File::Copy::Recursive;
use Cwd;
my $file;
my (@FILES,@File_01);
my ($dir_01,$dir_02);
my $new_file="Kernel.txt";
chdir('C:\\abd\\efg');
$dir_01 = getcwd;
opendir(DIR_01, $dir_01);
@FILES=readdir(DIR_01);
close(DIR_01);
foreach $dir_02 (@FILES)
{
  opendir (DIR_02, "$dir_01"."/"."$dir_02") ;
   @File_01=readdir(DIR_02);
   close(DIR_02);
    foreach  $file (@File_01)
    {
      open(FH,"<","$dir_01/$dir_02/$file") or die "can not open the file $!\n";
        while(my $lines = <FH>)
        {
          if($lines=~ m/Linux kernel Version/i || $lines=~ m/USB_STATE=DISCONNECTED/gi)
           {
            #print "\t$lines\n\n";
            rename($file,$new_file) or die "can not change the name";
            }
        }
    }
}   

2 个答案:

答案 0 :(得分:0)

rename($file,$new_file) 

将无效,因为您没有指定路径

rename("$dir_01/$dir_02/$file", $new_file)

但同样,任何匹配的文件都会在当前目录中重命名为Kernel.txt 。这是预期的行为吗?

答案 1 :(得分:0)

尝试模块File :: Next 例如:

my $iter = File::Next::files($some_dir);
while(my $fn = $iter->()) {
    my $rename = 0;
    open(my $FILE,'<',$fn);
    while(my $line = <$FILE>) {
        if($lines=~ m/Linux kernel Version/i || $lines=~ m/USB_STATE=DISCONNECTED/gi)
            $rename = 1;
            last;
        }
    }
    close($FILE);
    if($rename) {
        rename($fn,$new_file) or die "can not change the name";
    }
}

也许你无法重命名,因为重命名打开文件 尝试在关闭打开文件后重命名