用于在文件内增加文件名中的数字的脚本或命令

时间:2015-09-28 13:39:27

标签: regex bash perl unix

我有一个文件,其中我们有以下格式的条目。我想增加此文件中文件名中的数字。因此some_v1.png将成为some_v2.png。有没有办法使用正则表达式或命令行实用程序来实现这一点。

以下是文件条目为字符串的示例文件(file.config)。

something/some_v1.png
something/some_v4.png
something/some_v3.png

3 个答案:

答案 0 :(得分:1)

如果要重命名一堆文件,我会使用辅助目录和测试来查看是否有要重命名的实际文件。

mkdir aux
for i in {1..7} ; do
    j=$($i + 1)
    [ -f something/some_v${i}.png ] && mv something/some_v${i}.png aux/some_v${j}.png
done
mv aux/* something
rmdir aux

对于辅助目录使用固定名称无法在动态生产环境中重复使用进行安全审查,但我认为在受控环境中一次性使用是正常的。

答案 1 :(得分:1)

perl

#!/usr/bin/env perl
use strict;
use warnings;

foreach
    my $filename ( 
    sort { $b =~ s/.*(\d+).*/$1/r <=> $a =~ s/.*(\d+).*/$1/r }
    glob "something/some_v*.png" )
{
    chomp $filename;
    if ( my ($vnum) = $filename =~ m/(\d+)\.png/ ) {
        print "mv $filename ", $filename =~ s|\d+\.png|++$vnum.".png"|re,
            "\n";
    }
}

注意 - 在重命名为5之前,以数字方式排序,以确保您永远不会将4替换为5。

答案 2 :(得分:1)

这看起来非常适合awk的“拆分”功能:

awk '{n=split($0,a,"[1-9][0-9]*",s);for(i=1;i<n;++i)printf "%s%d",a[i],s[i]+1;print a[n]}'

您已经找到的perl单行程也很有效,但有一个例外:前导零数字的文件将丢失零。以下是使用魔法自动增量的修复:

perl -pe 's/(\d+)/++($a=$1)/eg'