2015-08-18 50 views
0

我用csplit可寫,從一個單一的大文件分離較小的文件bash腳本循環和重命名文件(S)

#!/bin/bash 
OBJECT=$1; $TARGET="bigfile.pgn"; 

FIRST_NEW_GAME=$2; 

csplit $TARGET /Event/ {*}; 

ls xx* 

echo 'How many games do we have?'; read NUMGAMES 

#xx00 xx01 xx02 xx03 xx04 xx05 
# I just grab "5" for $NUMGAMES 

我現在有5個文件,並準備好將其重命名爲$ FIRST_NEW_GAME + 1

while [ $X -le $NUMGAMES ]; do 
let X=X+1 
pseudo code: mv xx[01-05] 5337+[$X].pgn 
done; 

我有XX [01-01]和要創建FIRST_NEW_GAME( 「5436」)+ $ X 例如:XX01變得5336.pgn,XX02變得5337.pgn等

但最後一次循環超出我的範圍。有任何想法嗎?

+0

csplit有選項'--suffix-format'&'--prefix'。看看這些是否會幫助你。您可能根本不需要任何額外的bash代碼... – anishsane

+0

不適用於這種情況。 – verlager

回答

1

你的僞代碼和示例使用了不同的偏移,只要選擇一個,並填寫。 在計算((newnum = num + offset))外殼知道它是與變量的計算,並且你需要$的瓦爾的價值。

offset=5337 
for file in xx[0-9]*; do 
     # Special syntax to cut of the xx, this is faster than 
     # num=$(cut -dx -f3) 
     # Using cut is easier to remember ;) 
     num0=${file##*x} 
     #num0 can start with a 0, thats octal. Remove the 0 in the front. 
     num=${num0#0} 
     ((newnum = num + offset)) 
     mv $file ${newnum}.pgn 
done 

編輯:用XX01進行試驗,直到XX05,但我忘了,05是5八進制。 對於05這是沒有問題的,08和09是!

+0

非常好!唯一的問題是第一個xx00必須被跳過,並且for循環過程xx01及之後。如何才能做到最好?哦,傻我!就這樣吧,EZ就像餡餅。 – verlager

+0

當你不想刪除該文件時,只跳過,你可以添加'if [「$ {file}」=「xx00」];然後繼續; fi' –

+0

謝謝你! – verlager