我正在编写一个 bash 脚本,我需要在其中检查现有文件的目录,并在将新文件添加到目录时查看文件名第一段的最后 4 位数字以设置计数器。
命名结构:
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 已经生锈了。
替代版本,使用 Bash 数组:
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"
注意:此版本假定文件名中没有空格。
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 *
尝试这个...
current=`echo yymmddHNAZXLCOM0001.835 | cut -d . -f 1 | rev | cut -c 1-4 | rev`
next=`echo $current | awk '{printf("%04i",$0+1)}'`