コマンドライン: ファイル名が既に存在する場合は新しいファイル名でファイルを作成する

コマンドライン: ファイル名が既に存在する場合は新しいファイル名でファイルを作成する

1 つのファイルを作成するコマンドがあるが、そのコマンドが実行されるたびに、前回の実行で作成されたファイルが上書きされないということが可能かどうか疑問に思っていました。

たとえば、touch test1.txtというファイルを 1 つ作成しますtest1.txt。ただし、次に実行するときには、新しいファイルを などの名前にしますtest2.txt。つまり、既存のファイルを上書きせずに、問題なく複数回実行できるということです。

誤解しないでください。1 つのコマンドで複数のファイルを作成しようとしているわけではありません。

前もって感謝します!

答え1

最も簡単な解決策は、ファイル名にタイムスタンプを追加し、1 桁の数字を使用しないことです。

空のファイルを作成する最も簡単な方法は、 であり、touch test$(date +%Y%m%d-%H%M%S)という名前のファイルが作成されますtest20110802-170410。 2 回目にはtest*新しいタイムスタンプが取得されるため、2 つのファイルが作成されます。

答え2

それを実行するための一般的なコマンドが存在するとは思いませんが、次のようなものが考えられます。

create() {
  read prefix number suffix < <(sed -r 's/(.*)([0-9]+)\.(.*)$/\1 \2 \3/' <<<"$1")
  while true; do
    file="$prefix$number.$suffix"
    if [[ -e "$file" ]]; then
      ((number++))
    else
      touch "$file"
      break
    fi
  done
}

関数への入力パラメータは、プレフィックス、番号、サフィックスに分割され、ファイルが存在するまで番号が増加します。空きスロットが見つかると、ファイルは で作成されますtouch

分割メカニズムはニーズに合わせて調整する必要があり、さまざまなエラー チェックを追加する必要があります。

答え3

シーケンス番号が必要ない場合は、コマンドを使用するのが最も簡単な方法ですmktemp

関連情報