2012-11-05 30 views
2

假設我有4000個文件:如何將數字連續文件名更改爲相同的前綴但不同的後綴名?

output1 
output2 
output3 
output4 
output5 
output6 
output7 
output8 
..... 
output3999 
output4000 

如何更改前綴相同,但不同的後綴,每兩個數字連續文件?在這個例子中我想要的文件的名稱被改變爲:

output1  -> Type0001_A.abc 
output2  -> Type0001_B.abc 
output3  -> Type0002_A.abc 
output4  -> Type0002_B.abc 
output5  -> Type0003_A.abc 
output6  -> Type0003_B.abc 
output7  -> Type0004_A.abc 
output8  -> Type0004_B.abc 
.....    ..... 
output3999  -> Type2000_A.abc 
output4000  -> Type2000_B.abc 

我做了一個簡單的循環,可以解決這個前綴,但還是不知道如何後綴數字和字母可以做到的。

for i in `find . -name "output*"` 
do 
l=`echo $i |sed 's/output/Type/'` 
'$i > $l` 
done 

有什麼建議嗎?有關「循環」的進一步在線參考資料非常感謝。謝謝。

+5

[你嘗試過什麼?](http://whathaveyoutried.com) –

+0

你可以很容易的環路由2增大做到這一點的,但是那並不是」 •允許進行任何健康檢查。 – N13

+2

我建議使用您選擇的腳本語言來生成一系列'mv'命令,您可以在將它們饋送到外殼之前進行可視化檢查。應該是一個循環和一些簡單的算術/字符串操作。 –

回答

3

你可以寫:

for suffix in 000{1..9} 00{10..99} 0{100..999} {1000..2000} ; do 
    mv "output$((10#$suffix * 2 - 1))" "Type${suffix}_A.abc" 
    mv "output$((10#$suffix * 2))" "Type${suffix}_B.abc" 
done 

注:

  • 這裏不需要雙引號,但沒有他們,堆棧溢出的語法高亮顯示變得非常混亂。 (特別是,它認爲基數十算術常數中的#開始評論。)嘿,無論如何,將參數擴展包裝在雙引號中總是一個好習慣。
  • 如果需要,可以通過使用外部程序seq並寫入$(seq -w 1 2000)而不是000{1..9} 00{10..99} 0{100..999} {1000..2000}來簡化第一行。對於這個問題,如果你有Bash 4.x,你可以寫{0001..2000}
+0

非常好。你能澄清'10#'做什麼嗎?它只是刪除子串? – N13

+1

@ N13:在算術表達式中,形式爲'7#32'的常量表示「在基數'7'中被表示爲'32'」的整數(即3×7 + 2 = 23)。通常'10#'不是必須的,但是以'0'開頭的常量被認爲是以8爲底的 - 例如'032'意味着3×8 + 2 = 26 - 並且'$ suffix'是零填充到四位數字,所以我使用前綴'10#'來防止這種情況。 – ruakh

+0

錯過了我的不好。 – Kevin

2

這可能會爲你工作(GNU sed的&平行):

parallel --xapply mv output{1} Type{2}.abc ::: $(seq 4000) ::: $(seq -f '%04g_A' 2000|sed 'h;s/A/B/;H;g') 
1

使用bash:

i=0 
ab=([0]=A [1]=B) 
for f in output*; do 
    n=${f#output} 
    printf -v newname "Type%04d_%c.abc\n" $(((n+1)/2)) ${ab[i]} 
    i=$(((i+1)%2)) 
    mv "$f" "$newname" 
done 
1

你可以這樣做:

seq 1 2000 | while read num; do 
    echo "output$((num*2-1))" "Type$(printf "%04d" $num)_A.abc" 
    echo "output$((num*2+0))" "Type$(printf "%04d" $num)_B.abc" 
done 

如果你很高興與輸出,由mv更改echo

循環中的引用可以在shell的man中找到。

1

使用awk另一種解決方案:

awk '{if(NR%2){printf "%s%s%04d%s\n",$0, " -> Type",(NR+1)/2,"_A.abc"} else {printf "%s%s%04d%s\n",$0, " -> Type",NR/2,"_B.abc" }}' file 
相關問題