【问题标题】:Mass rename JPG files using command line or perl?使用命令行或 perl 批量重命名 JPG 文件?
【发布时间】:2013-05-03 16:58:01
【问题描述】:

我需要大量重命名的文件夹中有 519 个 JPG 文件。在文件 newnames.txt 中,我列出了 519 个新文件名。有没有办法通过命令行或 perl 来运行该名称列表(每个都在一个新行上)并重命名所有文件?

【问题讨论】:

  • 看看rename 实用程序。如果这没有帮助,那么您需要使用如何在 newnames.txt 和实际文件名之间进行映射来更新您的问题。基本的 bash 循环如下所示:while read nn; do echo $nn; done < newnames.txt 用你的魔法替换 echo
  • 看一下File::Copy模块中的move函数。
  • 1.到目前为止你做了什么? 2.newnames.txt的格式是什么?
  • 第二:如何将文件名映射到“newnames.txt”数据?

标签: perl shell unix


【解决方案1】:

由于您没有指定如何将文件名映射到“newnames.txt”数据,我将给出几个解决方案:

如果文件名按字母顺序排序,并且新名称的顺序对应于该顺序:

use File::Slurp; 
use File::Copy qw/move/;
my @newnames=read_file("newnames.txt");
chomp(@newnames);
my @files = glob("*.JPG");
for (my $i=0; $i < @files; $i++) {
    die "Not enough new names for file $files[$i]" unless $newnames[$i];
    move($files[$i], $newnames[$i])
          or die "Failed to move $files[$i] to $newnames[$i] : $!";
}

如果文件名与新名称位于同一文件中,则为 2 列:

use File::Slurp; 
use File::Copy qw/move/;
my @newnames=read_file("newnames.txt");
chomp(@newnames);
foreach my $line (@newnames) {
    my ($file, $new)= split(/,/, $line);
    move($file, $new)
          or die "Failed to move $file to $new : $!";
}

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 2012-11-15
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2012-06-13
    • 2012-12-24
    • 2010-12-22
    相关资源
    最近更新 更多