2016-11-14 54 views
3

隨着Linux我想在使用的格式中自動添加Oracle數據庫表空間。要做到這一點,我想比前一個文件增加+1。Linux Bash自動編號的文件名沒有刪除前導零

數據文件通常被稱爲與這個格式:

/ora/oradata/tablespace_datafile.dbf 
/ora/oradata/tablespace_datafile_02.dbf 
/ora/oradata/tablespace_datafile_3.dbf 

我能向$basefilename提取與sed 's/[0-9].*//一個變量,其給出作爲輸出:/ora/oradata/tablespace_datafile_

我也能夠提取sed s/[^0-9]//g的數字應該爲$counter的變量,這給出了上述示例的輸出:分別爲023

我,但是,有困難添加+1到$counter,而不刪除前導零(02應該是未來03,而是,我得到3。我使用let counter++

當前代碼:

basefilename=`echo $connectdb | sed 's/[0-9].*//'` 
counter=`echo $connectdb | sed 's/[^0-9]//g'` 
let counter++ 
nextdatafilename=$basefilename$counter'.dbf' 

任何建議

+1

和'09'應該跟隨什麼? '10'還是'010'? – Leon

+1

在'%02d'中使用'$ basefilename $(prinf「%02d」$ counter)'。dbf'''2'應該換成真正想要的數字 – GMichael

+0

嗨,是的,10應該跟着09. –

回答

2

這bash函數將遞增的?數字參數保留爲需要的前導零(注意語法高亮由${parameter##word}參數擴展語法混淆):

inc() (shopt -s extglob; printf "%0${#1}d" $((${1##+(0)} + 1))) 

例子:

$ echo $(inc 1) 
2 
$ echo $(inc 01) 
02 
$ echo $(inc 001) 
002 
$ echo $(inc 09) 
10 
$ echo $(inc 009) 
010 
$ echo $(inc 0) 
1 

使用它,您的具體情況:

nextdatafilename="$basefilename$(inc $counter).dbf" 

說明:

  • printf "%0${#1}d"使用至少儘可能多的數字作爲參數包含
  • shopt -s extglob能夠延長圖案匹配,使得擴大${1##+(0)}移除所有前導零(這是必需的,因爲具有零前綴的數字是由bash的解釋格式化該結果作爲八進制)。
  • 函數體被包含在括號中而不是大括號中,因此shopt -s extglob的效果對函數調用是本地的,並且不會影響調用者的環境。
+0

魅力!謝謝。我已經看到並瞭解了一些功能,但從未見過像這樣的東西。 –

+0

但是,此功能在100停止。 –

+0

@IvanM你是什麼意思? – Leon

2

隨着perl基於rename命令

rename -n 's/0*\K\d+(?=\.dbf)/$&+1/e' *.dbf 
  • 0*\K忽略前導零
  • \d+匹配位數
  • (?=\.dbf)假定數字與文件名擴展名結尾如OP提到的,這可確保號碼沒有匹配其他地方。如果不需要
  • $&+1添加一個匹配的數字
  • /e此改性劑允許使用表達式代替字符串中替換部分

-n選項rename命令允許之前運行的幹測試可被移除實際重命名


樣品測試

$ rename -n 's/0*\K\d+(?=\.dbf)/$&+1/e' tst/*.dbf 
rename(tst/abc_01.dbf, tst/abc_02.dbf) 
rename(tst/aef_2.dbf, tst/aef_3.dbf) 


如果09已被更改爲10代替010

$ rename -n 's/\d+(?=\.dbf)/sprintf "%02d", $&+1/e' tst/*.dbf 
rename(tst/abc_01.dbf, tst/abc_02.dbf) 
rename(tst/aef_09.dbf, tst/aef_10.dbf) 

變化%02d%03d爲三位數的格式等等...

0

嘗試

nextdatafilename=$(printf "%s%02d.dbf" $basefilename $counter)