我正在尝试将字符串(reference_)作为所有目录和子目录中所有* .bmp文件的名称的前缀。我们第一次运行silk脚本时,它将创建目录以及子目录,并在每个子目录下,它将使用.bmp扩展名存储每个移动应用程序的sceenshot。

当我第二次运行自动化silkscript时,它将再次在所有子目录中创建* .bmp文件。在第二次运行脚本之前,我想在* .bmp前面添加一个字符串first_screen.bmp

例如reference_first_screen.bmp到<=>, 我有如下目录结构:

C:\Image_Repository\BG_Images\second
...
C:\Image_Repository\BG_Images\sixth

有<=>和<=>文件等......

有人可以帮助我吗?

如何使用<=>字符串?

为所有图像文件名添加前缀

当我第二次运行脚本时,丝绸中的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文件夹中的文件,但实际上它并没有更新子目录中的文件。

有帮助吗?

解决方案

您不打开要写入的目录。只需使用不带字符串模式部分的 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";  
    }

其他提示

您应该查看 File :: Find 模块 - 将使目录树的上下递归变得更简单。

您应该扫描文件名并修改那些不以reference_开头的文件名,以便他们这样做。这可能需要将文件名拆分为目录名和文件名,然后在文件名部分前加上use strict;。这是通过 File :: Basename 模块完成的。

在某些时候,您需要决定第三次运行脚本时会发生什么。已经以-w开头的文件是否被覆盖,或者是否覆盖了未加前缀的文件,或者是什么?

未重命名文件的原因是重命名操作已注释掉。请记住在脚本的顶部添加@files(以及您使用的<=>选项)。

如果你得到一个数组<=>中的文件列表(并且名称是基本名称,所以你不必使用File :: Basename),那么循环可能如下所示:

   foreach my $one (@files)
   {
        my $new = "reference_$one";
        print "$one --> $new\n";
        rename $one, $new or die "failed to rename $one to $new ($!)";
   }

借助 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 '$_': $!)"
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top