Bashで順番に番号付けされたファイル名を作成するには?

Bashで順番に番号付けされたファイル名を作成するには?

ファイルと次のファイルを順番に生成するには、スクリプトが必要です。スクリプトを実行するたびに1つのファイルのみを生成する必要があり、特定の日にスクリプトを0回以上実行できます。ファイル名は現在の日付に従って指定する必要があり、%y%m%d2番目のファイルを追加するか、特定の日付-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"

答え1

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今日の日付を取得するには、カウンタをnumber0に初期化し、サフィックス付きの日付で初期ファイル名を作成します.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

後続の実行を待ちます。

答え2

あなたはそれを使用することができますseq。さまざまな方法で番号付け順序を作成できますが、ファイルの総数を知る必要があります。

例:これを試してみてくださいseq -w 1 10。これにより、forループに含めることができる01シーケンスが作成されます。10

for i in `seq -w 1 10`
do
  touch `date +%Y%m%d`-$i.txt
done

最近の質問の付録が更新されました。

欲しいものを簡単に達成するには-0。後続の実行では、ファイルのリストをsortインポートし、最後のファイルから最後のファイルを抽出し、番号をインポートして増分し、その番号で新しいファイルを作成する必要があります。cut-

しかし、塗りつぶすにはまだ少し作業が必要です。

答え3

まるで…

#!/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などに変更することは、読者の練習課題として残しています:)

また、同時に複数回スクリプトを呼び出さないようにする必要があります。そうしないと、複数のスクリプトが変更することが発生します。

注:複数のバージョンのファイルを管理できるソフトウェアがたくさんあります。これを「バージョン制御システム」(VCS)または「ソースコード制御管理」(SCM)と呼びます。 GitとSubversionは非常に人気があります。自分で再実装するのではなく、確認してみることをお勧めします。 :-)

答え4

カウンタの値がすでに環境変数にある場合は、Bash算術を使用してファイル名を生成できます。

$ 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

関連情報