我正在编写一个脚本,它将读取文件并根据文件内容重新命名文件。
我面临的问题:
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 :(得分: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";
}
}
也许你无法重命名,因为重命名打开文件 尝试在关闭打开文件后重命名