从最新文件的文件名中提取字符

时间:2012-10-09 18:07:32

标签: bash shell

我正在编写一个bash脚本,我需要检查现有文件的目录,并查看文件名第一段的最后4位数,以便在将新文件添加到目录时设置计数器。

命名结构:

yymmddHNAZXLCOM0001.835

我需要将示例0001中的部分放入CTR变量中,这样它放入目录的下一个文件将是

yymmddHNAZXLCOM0002.835

等等。

最简单,最短的方法是什么?

3 个答案:

答案 0 :(得分: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生锈了。

备用版本,使用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"

注意:此版本假定文件名中没有空格。

答案 1 :(得分:0)

试试这个......

current=`echo yymmddHNAZXLCOM0001.835 | cut -d . -f 1 | rev | cut -c 1-4 | rev`
next=`echo $current | awk '{printf("%04i",$0+1)}'`

答案 2 :(得分: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 *