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


8

1つのファイルを作成するコマンドがあるのではないかと思っていましたが、コマンドを実行するたびに、前回の実行で作成されたファイルが上書きされることはありません。

たとえば、touch test1.txtと呼ばれる1つのファイルを作成しますtest1.txt。しかし、次にそれを実行するときに、新しいファイルが呼び出されるtest2.txtようにしたいです。そのため、既存のファイルを上書きすることなく。ある方法では、問題なく複数回実行できます。

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

前もって感謝します!

回答:


9

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

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


これは私が探していたものです、ありがとう!:)
Nick Lemaire、2011

スクリプトでは動作しません(間で待機していません)-私が試したところtouch test$(date +%Y%m%d-%H%M%S) ; touch test$(date +%Y%m%d-%H%M%S)、1つのファイルしか作成されませんでした。Nanoseconds-timeは機能しtouch test$(date +%Y%m%d-%H%M%S%N) ; touch test$(date +%Y%m%d-%H%M%S%N)touch test$(date +%Y%m%d-%H%M%S%N) test$(date +%Y%m%d-%H%M%S%N)それぞれ2つのファイルを作成します。
Volker Siegel

$()式をネストできるため、使用する方が適切ですが、バックティックを使用することもできます touch test`date +%Y%m%d-%H%M%S`
パブロビアンキ

5

それを行うための一般的なコマンドは存在しないと思いますが、次のように考えることができます。

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。ファイルはで作成されました。

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


素晴らしい、素晴らしい機能。
Marco Ceppi

1

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


mktempは、テンプレートを使用して、ランダムで一意のファイル名を生成します。mktempの出力を変数に取り込む可能性があります。linuxmanpagesから:TMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE
bgvaughan 2011

別の一般的な方法は、シェル変数$$から、現在のプロセスIDを使用することであるTMPFILE='/tmp/tmp.$$'; touch $TMPFILE
bgvaughan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.