私のシステムは、特定のイベントが発生するたびに新しいテキストファイルを生成します。
ファイル名file_a.txt
file_b.txt
file_c.txt
などを指定する必要があります。
Bashシェルスクリプトで次にどのファイル名を使用するべきかをどのように知ることができますか?
たとえば、がfile_a.txt
存在file_b.txt
するが存在しない場合、file_c.txt
使用可能な次のファイル名はですfile_c.txt
。
より簡単な場合は数字かもしれません。
アルゴリズム設計を始めていますが、もっと簡単な方法がありますか?
注:ファイルは毎日削除されるため、到着確率z
は0です。したがってz
、すべての戦略が許可されます。aa
整数、さらにはUUIDも使用してください。
ベストアンサー1
以下は(エラーチェックなし)bashでのみ実行するおおよその方法です。
#helper function to convert a number to the corresponding character
chr() {
[ "$1" -lt 256 ] || return 1
printf "\\$(printf '%03o' "$1")"
}
#helper function to convert a character to the corresponding integer
ord() {
LC_CTYPE=C printf '%d' "'$1"
}
#increment file
fn_incr(){
#first split the argument into its constituent parts
local fn prefix letter_and_suffix letter suffix next_letter
fn=$1
prefix=${fn%_*}
letter_and_suffix=${fn#${prefix}_}
letter=${letter_and_suffix%%.*}
suffix=${letter_and_suffix#*.}
#increment the letter part
next_letter=$(chr $(($(ord "$letter") + 1)))
#reassemble
echo "${prefix}_${next_letter}.${suffix}"
}
使用例:
fn_incr foo_bar_A.min.js
#=> foo_bar_B.min.js
複数のアルファベットインデックスを使用してbashでこれを行うには、より長いコードが必要です。いつでも他の実行可能ファイルでこれを実行できますが、ファイル名を一括して増やしたい場合があります。そうしないと、実行可能ファイルの開始オーバーヘッドによってプログラムが許可できないほど遅くなる可能性があります。それはすべてユースケースによって異なります。
ここでは、9 ++が左にオーバーフローする方法を手動で管理する必要がないため、通常の整数を使用する方が良い選択でしょう。
chr()
そしてord()
恥ずかしく盗んだ。アルファベットASCII値を取得するBashスクリプト