2013-07-11 53 views
-1

我正在研究一个脚本,它将读取文件,并根据文件内容重新命名文件。如何遍历目录和子目录中的所有文件

问题,我现在面临:

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"; 
      } 
     } 
    } 
} 
+0

你的意思是“无法打开”重命名?你有错误信息吗?哪一个? – Matteo

+1

[如何遍历目录中的所有文件;如果它有子目录,我想遍历子目录中的文件](http://stackoverflow.com/questions/9600395/how-to-traverse-all-the-files-in-a-directory-if-it-has -subdirectories -i-want-t) – innaM

回答

0
rename($file,$new_file) 

不会工作,因为你没有指定路径

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

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

+0

是的,这是预期的行为。先生那么我的第二个问题,我的意思是我将如何阅读子目录文件:( – Maverick

+0

@Maverick你应该是一个更具体一点:这是实际的问题?一个错误?什么都没有发生?你有没有尝试写的内容@ FILES'和'@ File_01'到控制台? – Matteo

+0

@ Matteo我没有得到任何错误,它是所有的内容。 – Maverick

0

尝试模块文件::接下来 例如:

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"; 
    } 
} 

也许你不能重命名,因为重命名打开文件 尝试后关闭打开的文件