-1

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

我面临的问题:

第一个我无法读取子目录中的文件。第二我试图重命名文件但发生错误。

这是我的代码:

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

其中 a,b,c,d,e 是 dir File,File 是 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";
            }
        }
    }
}   
4

2 回答 2

0
rename($file,$new_file) 

将不起作用,因为您没有指定路径

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

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

于 2013-07-11T09:08:03.907 回答
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";
    }
}

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

于 2013-07-11T10:36:18.540 回答