使用“重命名”更改多个文件的名称

时间:2014-08-20 16:36:11

标签: linux perl rename

我有大约100个文件,我想在所有文件名中将字母P更改为字母B.但是在使用rename命令时:

rename 's/\P/\Bi/' *.txt 

我收到以下消息

Empty \P{} in regex; marked by <-- HERE in m/\P <-- HERE / at (eval 1) line 1.

请帮助

由于

2 个答案:

答案 0 :(得分:1)

两个错误。首先,您不需要逃离PB,因为它们不是特殊字符。第二,如果i表示不区分大小写,那么这是一个标志,需要在最后。

rename 's/P/B/i' *.txt

这会将第一次出现Pp更改为B。如果您想要更改所有匹配项,请使用g标记,这意味着global,如下所示:

rename 's/P/B/ig' *.txt

根据新要求进行更新:

从任何复杂的情况来看,最好编写自己的perl脚本。以下是使用File::Copy核心模块的快速示例。

use strict;
use warnings;
use File::Copy;

my $dir = '/path/to/your/files/';    # path to your files
opendir my ($dh), $dir;
my @files = grep { /\.txt$/ } readdir $dh;  # create a list of all files

for(@files) {
    my $cnt;
    my $from = $_;
    chomp $from;
    (my $to = $from) =~ s/(P)/++$cnt>=2 && $cnt<=3 ? "B" : $1/gie;
    #print "from:$from   to:$to\n";
    move("$dir$from", "$dir$to") if ($to ne $from);
}

我们创建一个临时变量$cnt并使用以下条件检查相关字符是第二个还是第三个。如果是,我们将其替换为B,否则我们保留原样。

++$cnt>=2 && $cnt<=3 ? "B" : $1

答案 1 :(得分:0)

不要转义字母,也请在关闭斜线后放置regexp修饰符

rename 's/P/B/ig' *.txt

有关regexp的详细信息,请参阅perlre

相关问题