我正在寫一個bash腳本,我將需要檢查現有文件的目錄並查看文件名第一段的最後4位數以在添加新文件時設置計數器到目錄。從最新文件的文件名中提取字符
命名Scructure:
yymmddHNAZXLCOM0001.835
我需要把部分的示例0001到CTR變量,因此它把進入目錄的下一個文件將是
yymmddHNAZXLCOM0002.835
等。
什麼是最簡單和最短的方法來做到這一點?
我正在寫一個bash腳本,我將需要檢查現有文件的目錄並查看文件名第一段的最後4位數以在添加新文件時設置計數器到目錄。從最新文件的文件名中提取字符
命名Scructure:
yymmddHNAZXLCOM0001.835
我需要把部分的示例0001到CTR變量,因此它把進入目錄的下一個文件將是
yymmddHNAZXLCOM0002.835
等。
什麼是最簡單和最短的方法來做到這一點?
你可以用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"
注:此版本假定文件名不具備在它的空間。
嘗試......
current=`echo yymmddHNAZXLCOM0001.835 | cut -d . -f 1 | rev | cut -c 1-4 | rev`
next=`echo $current | awk '{printf("%04i",$0+1)}'`
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 *
將這項工作如果文件名的年月月日日部分和0001部分總是根據最新的文件是與命名約定什麼樣的變化? – camarokris
@ camarokris-正則表達式緊接着四個連續的數字後面緊跟一個點,所以文件名中的數字不應該成爲問題。如果你的文件名也有點,那隻會有問題。 – bta