web-dev-qa-db-ja.com

bashで連番の付いたファイル名を作成するにはどうすればよいですか?

シーケンスの次のファイルでファイルを作成するスクリプトが必要です。スクリプトを実行するたびに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"
7
Greg B
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

以降の実行で等。

12
Kusalananda

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を取得して、番号を取得し、増分して、その番号の新しいファイル。

ただし、パディングにはさらに作業が必要です。

3
bayindirh

何かのようなもの...

#!/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はかなり人気があります。自分で再実装するのではなく、チェックアウトすることをお勧めします:-)

3
Wouter Verhelst

環境変数にすでにカウンター値がある場合、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
0
MikeW