Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2912

ファイル作成時に名前が重複したら番号をつけるシェルスクリプト

$
0
0

スクリプト概要

  • 引数で指定したファイル名の空ファイル作成
  • すでに同名のファイルが存在すれば番号をつけて作成
  • 番号がついたファイルも存在していればその番号より一つ大きい番号をつけて作成
#!/bin/bashfile=$1if[[-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}

ファイル名が重複していない場合は番号なしでそのまま作成されます。


Viewing all articles
Browse latest Browse all 2912

Trending Articles