2012-10-09 27 views
1

我正在寫一個bash腳本,我將需要檢查現有文件的目錄並查看文件名第一段的最後4位數以在添加新文件時設置計數器到目錄。從最新文件的文件名中提取字符

命名Scructure:

yymmddHNAZXLCOM0001.835 

我需要把部分的示例0001到CTR變量,因此它把進入目錄的下一個文件將是

yymmddHNAZXLCOM0002.835 

等。

什麼是最簡單和最短的方法來做到這一點?

回答

1

你可以用sed做到這一點:

filename="yymmddHNAZXLCOM0001.835" 
first_part=$(echo $filename | sed -e 's/\(.*\)\([0-9]\{4,4\}\)\.\(.*\)/\1/') 
counter=$(echo $filename | sed -e 's/\(.*\)\([0-9]\{4,4\}\)\.\(.*\)/\2/') 
suffix=$(echo $filename | sed -e 's/\(.*\)\([0-9]\{4,4\}\)\.\(.*\)/\3/') 
echo "$first_part$(printf "%04u" $(($counter + 1))).$suffix" 
=> "yymmddHNAZXLCOM0002.835" 

所有這三個sed呼叫使用相同的正則表達式。唯一改變的是選擇返回的組。有一種方法可以在一次通話中完成所有這些,但我的sed-fu已經生鏽了。

可選版本,採用了猛砸陣列:

filename="yymmddHNAZXLCOM0001.835" 
ary=($(echo $filename | sed -e 's/\(.*\)\([0-9]\{4,4\}\)\.\(.*\)/\1 \2 \3/')) 
echo "${ary[0]}$(printf "%04u" $((${ary[1]} + 1))).${ary[2]}" 
=> "yymmddHNAZXLCOM0002.835" 

注:此版本假定文件名不具備在它的空間。

+0

將這項工作如果文件名的年月月日日部分和0001部分總是根據最新的文件是與命名約定什麼樣的變化? – camarokris

+0

@ camarokris-正則表達式緊接着四個連續的數字後面緊跟一個點,所以文件名中的數字不應該成爲問題。如果你的文件名也有點,那隻會有問題。 – bta

0

嘗試......

current=`echo yymmddHNAZXLCOM0001.835 | cut -d . -f 1 | rev | cut -c 1-4 | rev` 
next=`echo $current | awk '{printf("%04i",$0+1)}'` 
0
f() { 
    if [[ $1 =~ (.*)([[:digit:]]{4})(\.[^.]*)$ ]]; then 
     local -a ctr=("${BASH_REMATCH[@]:1}") 
     touch "${ctr}$((++ctr[1]))${ctr[2]}" 
     # ... 
    else 
     echo 'no matches' 
    fi 
} 

shopt -s nullglob 
f *