perl - 如何为目录下的所有文件名添加前缀?

标签 perl file batch-rename

我正在尝试在所有目录以及子目录中的所有 *.bmp 文件的名称前加上一个字符串 ( reference_ )。我们第一次运行 Silk 脚本时,它会创建目录和子目录,并且在每个子目录下它会存储每个移动应用程序的屏幕截图 .bmp延期。

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

例如 first_screen.bmpreference_first_screen.bmp ,
我的目录结构如下:

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

first_screen.bmpfirst_screen.bmp文件等...

任何人都可以帮助我吗?

如何在所有图像文件名前加上 reference_字符串?

当我第二次运行该脚本时,Silk 中的 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;
}

我尝试使用 '+<' 模式打开调用,但我收到读写模式的编译错误。
当我运行此代码时,它会显示 BG_images 文件夹中带有前缀字符串的文件,但实际上它并没有更新子目录中的文件。

最佳答案

您不会打开目录进行写作。只需使用 opendir没有字符串的模式部分:

opendir my($dir), $dirname or die "Could not open $dirname: $!";

但是,你不需要那个。您可以使用 File::Find 来制作您需要的文件列表。

#!/usr/bin/perl
使用严格;
使用警告;

使用 File::Basename;
使用文件::查找;
使用 File::Find::Closures qw(find_regular_files);
使用 File::Spec::Functions qw(catfile);

我的($wanted,$reporter)=find_regular_files;
查找($通缉,$ARGV[0]);

我的 $prefix = 'recursive_';

foreach 我的 $file ( $reporter->() )
{
我的 $basename = basename( $file );

如果(索引($basename,$prefix)== 0)
{
print STDERR "$file 已经有'$prefix'!跳过。\n";
下一个;
}

我的 $new_path = catfile(
目录名($文件),
“recursive_$basename”
);

除非(重命名 $file,$new_path )
{
print STDERR "无法重命名 $file: $!\n";
下一个;
}

打印 $file, "\n";
}

关于perl - 如何为目录下的所有文件名添加前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/406396/

相关文章:

按顺序批量重命名文件的 PowerShell 命令

database - 如何使用 DBIC 在 Catalyst 中创建多个数据库连接

c - 使用通配符操作输入 .txt

windows - 关于 Vim 的三个问题

android - 编写由 Android 应用程序创建的私有(private)文件

linux - 在Linux中删除文件夹中所有文件的文件名的特定部分(第二个破折号之后的内容)

linux - 重命名并增加重复项

perl - pg_dump 单个表——可以在循环中执行吗?

perl - 将数据文件读入数组的正确方法

perl - 如何使用OLE模块处理Excel?