1

私はbashスクリプトを書いています。ここでは、既存のファイルのディレクトリを確認し、ファイル名の最初のセグメントの最後の4桁を調べて、ディレクトリに新しいファイルを追加するときにカウンターを設定する必要があります。

命名構造:

yymmddHNAZXLCOM0001.835

例0001の部分をCTR変数に入れる必要があるので、ディレクトリに置く次のファイルは次のようになります。

yymmddHNAZXLCOM0002.835

等々。

これを行うための最も簡単で最短の方法は何でしょうか?

4

3 に答える 3

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"

3つの呼び出しはすべてsed、同じ正規表現を使用します。変更されるのは、戻るために選択されたグループだけです。1回の呼び出しですべてを実行する方法はおそらくありますが、私の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"

注:このバージョンでは、ファイル名にスペースが含まれていないことを前提としています。

于 2012-10-09T18:20:43.313 に答える
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 *
于 2012-10-09T19:22:16.593 に答える
0

これを試して...

current=`echo yymmddHNAZXLCOM0001.835 | cut -d . -f 1 | rev | cut -c 1-4 | rev`
next=`echo $current | awk '{printf("%04i",$0+1)}'`
于 2012-10-09T18:22:29.987 に答える