2015-09-28 115 views
-3

我有一个文件,其中我们有以下格式的条目。我想增加此文件中文件名中的数字。所以some_v1.png将变成some_v2.png。有没有用正则表达式或命令行工具来实现这一点。脚本或命令来增加文件内的文件名中的数字

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

something/some_v1.png 
something/some_v4.png 
something/some_v3.png 
+3

如果你正在寻找重命名(移动)文件,要小心,不要执行此操作时覆盖现有文件! –

+1

它可以用perl perl -i -p -e's /(\ d +)/ $ 1 + 1/eg'来完成,例如'filename谢谢你的帮助 –

+0

为什么不使用for循环并且像'for i in {1 .. 5};做回声'something/some_v'$ i;完成' –

回答

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' 
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

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"; 
    } 
} 

注 - 数字排序,以确保你永远有4更换5,你已经更名为5

相关问题