シーケンスの次のファイルでファイルを作成するスクリプトが必要です。スクリプトを実行するたびに1つのファイルのみが作成され、スクリプトは特定の日に0回以上実行される可能性があります。ファイルには、現在の日付の後に%y%m%d
の形式で名前を付け、2番目のファイルに-01
を追加します。特定の日付に作成される3番目のファイルは-02
などになります。次に例を示します。
20170125.txt // first file create on the day.
20170125-01.txt // 2nd file
20170125-02.txt // 3rd file
これまでのところ、最初の毎日のファイルを作成するこの超基本的なスクリプトを持っていますが、その後の増分番号付けの方法に困惑しています。
#! /bin/bash
DATE=`date +%Y%m%d`
touch "$DATE.txt"
today=$( date +%Y%m%d ) # or: printf -v today '%(%Y%m%d)T' -1
number=0
fname=$today.txt
while [ -e "$fname" ]; do
printf -v fname '%s-%02d.txt' "$today" "$(( ++number ))"
done
printf 'Will use "%s" as filename\n' "$fname"
touch "$fname"
today
は今日の日付を取得し、カウンターnumber
をゼロに初期化して、.txt
サフィックスを付けた日付として初期ファイル名を作成します。
次に、ファイル名がすでに存在するかどうかをテストします。存在する場合は、カウンターをインクリメントし、printf
を使用して新しいファイル名を作成します。ファイル名の衝突がなくなるまで繰り返します。
printf
、%s-%02d.txt
のフォーマット文字列は、「文字列の後にリテラルダッシュとそれに続くゼロで埋められた2桁の整数と文字列.txt
」が続くことを意味します。文字列と整数は、printf
への追加の引数として指定されます。
-v fname
は、printf
の出力を変数fname
に入れます。
touch
はテストのためだけにあります。
これは次のようなファイル名を生成します
20170125.txt
20170125-01.txt
20170125-02.txt
20170125-03.txt
以降の実行で等。
seq
を使用できます。さまざまな方法で番号シーケンスを作成できますが、ファイルの総数を知る必要があります。
例:seq -w 1 10
を試すことができます。 01
から10
までのシーケンスを作成し、forループに含めることができます。
for i in `seq -w 1 10`
do
touch `date +%Y%m%d`-$i.txt
done
最新の質問更新の補足:
必要なことを簡単に実行するには、-0
を使用して最初のファイルを作成します。後続の実行では、ファイルのリストsort
を取得し、最後のファイルを取得し、最後の-
からcut
を取得して、番号を取得し、増分して、その番号の新しいファイル。
ただし、パディングにはさらに作業が必要です。
何かのようなもの...
#!/bin/bash
DATE=$(date +%Y%m%d)
filename="${DATE}.txt"
num=0
while [ -f $filename ]; do
num=$(( $num + 1 ))
filename="${DATE}-${num}.txt"
done
touch $filename
...うまくいくはずです。これにより、DATE-1.txt、DATE-2.txt、DATE-3.txt、...、DATE-10.txt、DATE-11.txtなどの形式のファイル名が作成されます。これをDATE-01.txtに変更しますなどは読者への演習として残されています:)
また、スクリプトを同時に2回以上呼び出さないようにしてください。そうしないと、複数のスクリプトが変更を加えることになります。
補足:ファイルの複数のバージョンを管理するためのソフトウェアがたくさんあります。それらは「バージョン管理システム」(VCS)、または「ソース管理」(SCM)と呼ばれます。 GitとSubversionはかなり人気があります。自分で再実装するのではなく、チェックアウトすることをお勧めします:-)
環境変数にすでにカウンター値がある場合、Bash算術を使用してファイル名を生成できます.... $((ctr + = 1))はctrの値を増分し、ファイル名文字列の値に置き換えます。
$ ctr=0
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ ls
file-1-name.txt file-2-name.txt file-3-name.txt file-4-name.txt