用于重命名文件的正则表达式

时间:2017-05-23 14:44:01

标签: regex bash rename

给出一个名字如下的数字文件:

2016_31_3_3_1c_02
2016_31_3_4_1a_02
2016_31_3_5_1d_02

我想批量重命名,所以他们读起来像

rename 's/03_01c/3_1c/'

我可以为每个文件执行rename,但这会破坏批处理的目的。

如何编写rename 's/0{0..9}_01{a..d}/命令的正则表达式来完成此操作? 类似于:# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress 但我不知道如何编写替换部分而不替换下划线之后的前导零,我想保留。

我也不太了解正则表达式去除前导零但是保持前导零之后的数字相同。我知道正则表达式找到那些实例但不替换它们。

2 个答案:

答案 0 :(得分:0)

您可以使用以下正则表达式

~s/\d{4}_\d{2}_\d{1,2}_\K0(\d)_0(\d)/$1_$2/

或者您也可以尝试以下正则表达式

~s/0(\d)_0(\d\w+)(?=.)/$1_$2/

一个班轮应该是

perl -e ' while(glob("*")){(my $newfilename=$_)=~s/0(\d)_0(\d\w+)(?=.)/$1_$2/; rename $_, $newfilename;} '

如果您在linux中,可以尝试使用ls命令(确保您在当前目录中)

ls | perl -ple '(my $newfilename=$_)=~s/0(\d)_0(\d\w+)(?=.)/$1_$2/; rename $_,$newfilename'

答案 1 :(得分:0)

只要您使用Linux,所有文件都在当前工作目录中,并且文件名的所有字段都是十进制的,除了第五个(十六进制),你可以使用这样的东西

要实际重命名文件,请移除@ARGV = qw/ ... /并取消注释rename,并将程序称为

perl rename.pl *

rename.pl

use strict;
use warnings 'all';
use feature 'say';
use autodie;

@ARGV = qw/
    2016_31_3_03_01c_02
    2016_31_3_04_01a_02
    2016_31_3_05_01d_02
/;

for ( @ARGV ) {

    my @f = split /_/;
    $_ = hex for $f[4];

    my $new = sprintf('%d_%d_%d_%d_%x_%02d', @f);

    say "$_ => $new";

    # rename $_, $new;
}

输出

2016_31_3_03_01c_02 => 2016_31_3_3_1c_02
2016_31_3_04_01a_02 => 2016_31_3_4_1a_02
2016_31_3_05_01d_02 => 2016_31_3_5_1d_02