スクリプト概要
- 引数で指定したファイル名の空ファイル作成
- すでに同名のファイルが存在すれば番号をつけて作成
- 番号がついたファイルも存在していればその番号より一つ大きい番号をつけて作成
#!/bin/bash
file=$1
if [[ -e ${file} ]]; then
maxnumber=$(find . -mindepth 1 -maxdepth 1 -printf "%f\n" \
| grep -e "^${file}\$" -e "^${file}_[0-9][0-9]*\$" \
| sed "s/^${file}_\\{0,1\\}//" \
| sed 's/^$/0/' \
| sort -rn \
| head -n 1 ) ;
file+="_$((maxnumber+1))"
fi
touch $file
解説
# findでカレントディレクトリ(.)のファイル一覧を検索
find . -mindepth 1 -maxdepth 1 -printf "%f\n"
# -mindepth 1と -maxdepth 1 で検索する階層をカレントのみに限定
# -printf でディレクトリ名を除いたファイル名だけを出力 (%f)し改行で区切る(\n)
# grep で番号なしファイルと番号ありファイルを検索
grep -e "^${file}\$" -e "^${file}_[0-9][0-9]*\$"
# -e オプションで正規表現を使用
# 「ファイル名_番号」 の内「ファイル名_」を除いて番号のみを出力
sed "s/^${file}_\\{0,1\\}//"
# {0,1}は直前の文字の0から1回以下の繰り返しを表すため、_があってもなくてもマッチする
# その際{}はエスケープ(\)が必要。\自体にもエスケープが必要なので\\となる
# 番号のついていないファイルは空行となるので0に置換
sed 's/^$/0/'
# ^は後に続く文字が行頭一致、$は直前の文字列が行末一致を指す
# ^$は間には何も書かれていないので空行を指す
# 数字の大きい順に並べ替え
sort -rn
# -r 逆順に並べ替えるオプション
# -n 文字列を数値とみなすオプション
# 一番大きい数字のみを出力
head -n 1
# -n 1 先頭の1行のみ出力
ここまでのコマンドで重複するファイル名の一番大きい数字を取得できた。
これらのコマンドをコマンド置換$()で囲むことで実行結果を変数maxnumberに代入している。
ここから新たに番号をつけてファイルを作成していく。
# ファイル名に 「_番号」を付与
file+="_$((maxnumber+1))"
# maxnumberに1を足してファイル名に「_番号」を追加
# ファイル作成
touch ${file}
ファイル名が重複していない場合は番号なしでそのまま作成されます。