2015-09-28 54 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

相關問題