我正在尝试将字符串(reference_
)作为所有目录和子目录中所有* .bmp文件的名称的前缀。我们第一次运行silk脚本时,它将创建目录以及子目录,并在每个子目录下,它将存储每个移动应用程序的sceenshot .bmp
扩展名。
当我第二次运行自动化silkscript时,它将再次在所有子目录中创建* .bmp文件。在第二次运行脚本之前,我想在* .bmp前面添加一个字符串reference_
。
例如first_screen.bmp
到reference_first_screen.bmp
,
我有如下目录结构:
C:\Image_Repository\BG_Images\second
...
C:\Image_Repository\BG_Images\sixth
拥有first_screen.bmp
和first_screen.bmp
个文件等...
有人可以帮助我吗?
如何使用reference_
字符串为所有图像文件名添加前缀?
当我第二次运行脚本时,丝绸中的Perl脚本将从子目录中获取两个图像并逐个像素地比较它们。我正在尝试下面的代码。 能否指导我如何继续完成这项任务。
#!/usr/bin/perl -w
&one;
&two;
sub one {
use Cwd;
my $dir ="C:\\Image_Repository";
#print "$dir\n";
opendir(DIR,"+<$dir") or "die $!\n";
my @dir = readdir DIR;
#$lines=@dir;
delete $dir[-1];
print "$lines\n";
foreach my $item (@dir)
{
print "$item\n";
}
closedir DIR;
}
sub two {
use Cwd;
my $dir1 ="C:\\Image_Repository\\BG_Images";
#print "$dir1\n";
opendir(D,"+<$dir1") or "die $!\n";
my @dire = readdir D;
#$lines=@dire;
delete $dire[-1];
#print "$lines\n";
foreach my $item (@dire)
{
#print "$item\n";
$dir2="C:\\Image_Repository\\BG_Images\\$item";
print $dir2;
opendir(D1,"+<$dir2") or die " $!\n";
my @files=readdir D1;
#print "@files\n";
foreach $one (@files)
{
$one="reference_".$one;
print "$one\n";
#rename $one,Reference_.$one;
}
}
closedir DIR;
}
我尝试用'+&lt;'打开电话模式,但我得到读写模式的编译错误。 当我运行此代码时,它会显示带有前缀字符串的BG_images文件夹中的文件,但实际上它并没有更新子目录中的文件。
答案 0 :(得分:3)
你可能应该查看File::Find模块 - 这样可以更简单地在目录树中向上和向下递归。
您应该扫描文件名并修改那些不以reference_
开头的文件名,以便他们这样做。这可能需要将文件名拆分为目录名和文件名,然后在文件名部分前加reference_
。这是通过File::Basename模块完成的。
在某些时候,您需要决定第三次运行脚本时会发生什么。已经以reference_
开头的文件是否被覆盖,或者是否覆盖了未加前缀的文件,或者是什么?
未重命名文件的原因是重命名操作已注释掉。请务必在脚本顶部添加use strict;
(以及您使用的-w
选项。)
如果你得到一个数组@files
中的文件列表(并且名称是基本名称,所以你不必使用File :: Basename),那么循环可能如下所示: p>
foreach my $one (@files)
{
my $new = "reference_$one";
print "$one --> $new\n";
rename $one, $new or die "failed to rename $one to $new ($!)";
}
答案 1 :(得分:3)
您不打开要写入的目录。只需使用opendir而不使用字符串的模式部分:
opendir my($dir), $dirname or die "Could not open $dirname: $!";
但是,你不需要那样做。您可以使用File :: Find来创建所需的文件列表。
#!/usr/bin/perl use strict; use warnings; use File::Basename; use File::Find; use File::Find::Closures qw(find_regular_files); use File::Spec::Functions qw(catfile); my( $wanted, $reporter ) = find_regular_files; find( $wanted, $ARGV[0] ); my $prefix = 'recursive_'; foreach my $file ( $reporter->() ) { my $basename = basename( $file ); if( index( $basename, $prefix ) == 0 ) { print STDERR "$file already has '$prefix'! Skipping.\n"; next; } my $new_path = catfile( dirname( $file ), "recursive_$basename" ); unless( rename $file, $new_path ) { print STDERR "Could not rename $file: $!\n"; next; } print $file, "\n"; }
答案 2 :(得分:0)
借助coreutils for Windows的find
实用程序:
$ find -iname "*.bmp" | perl -wlne"chomp; ($prefix, $basename) = split(m~\/([^/]+)$~, $_); rename($_, join(q(/), ($prefix, q(reference_).$basename))) or warn qq(failed to rename '$_': $!)"