Befehlszeile: Datei mit neuem Dateinamen erstellen, wenn der Dateiname bereits vorhanden ist

8

Ich habe mich gefragt, ob es möglich ist, einen Befehl zu haben, der eine Datei erstellt, aber jedes Mal, wenn der Befehl ausgeführt wird, wird die in der vorherigen Ausführung erstellte Datei nicht überschrieben.

Zum Beispiel: touch test1.txtwürde 1 Datei namens erstellen test1.txt. Aber wenn ich es das nächste Mal ausführe, möchte ich, dass die neue Datei aufgerufen wird test2.txt, oder so ähnlich. Also ohne die bereits vorhandene Datei zu überschreiben. In gewisser Weise könnte es ohne Probleme mehrmals ausgeführt werden.

Verstehen Sie mich nicht falsch, ich versuche nicht, mehrere Dateien mit einem Befehl zu erstellen.

Danke im Voraus!

Nick Lemaire
quelle

Antworten:

9

Die einfachste Lösung wäre, dem Dateinamen einen Zeitstempel hinzuzufügen und keine einzelne Ziffer zu verwenden.

Die einfachste Methode zum Erstellen einer leeren Datei wäre, touch test$(date +%Y%m%d-%H%M%S)und das würde zu einer Datei mit dem Namen führen test20110802-170410. Ein zweites Mal test*erhält einen neueren Zeitstempel, sodass 2 Dateien entstehen.

Rinzwind
quelle
Das ist genau das, wonach ich gesucht habe, danke! :)
Nick Lemaire
Funktioniert nicht in einem Skript (wartet nicht dazwischen) - Ich habe versucht touch test$(date +%Y%m%d-%H%M%S) ; touch test$(date +%Y%m%d-%H%M%S), es wurde nur eine Datei erstellt. Nanosekunden-Zeit funktioniert: touch test$(date +%Y%m%d-%H%M%S%N) ; touch test$(date +%Y%m%d-%H%M%S%N)und touch test$(date +%Y%m%d-%H%M%S%N) test$(date +%Y%m%d-%H%M%S%N)erstellen Sie jeweils zwei Dateien.
Volker Siegel
Ist besser zu verwenden, $()da Sie Ausdrücke verschachteln können, aber Sie können auch Backticks verwenden : touch test`date +%Y%m%d-%H%M%S`.
Pablo Bianchi
5

Ich bezweifle, dass es dafür einen allgemeinen Befehl gibt, aber Sie können sich so etwas vorstellen:

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
}

Der Eingabeparameter für die Funktion wird in Präfix, Nummer und Suffix aufgeteilt. Bis die Datei vorhanden ist, wird die Nummer erhöht. Es wurde ein freier Steckplatz gefunden, mit dem die Datei erstellt wird touch.

Der Aufteilungsmechanismus sollte an Ihre Bedürfnisse angepasst werden, und verschiedene Fehlerprüfungen sollten hinzugefügt werden.

Enzotib
quelle
brillante, tolle Funktion.
Marco Ceppi
1

Wenn keine Sequenznummern erforderlich sind, ist es am einfachsten, den mktempBefehl zu verwenden .

Michał Šrajer
quelle
mktemp generiert mithilfe einer Vorlage einen zufälligen, eindeutigen Dateinamen. Sie würden wahrscheinlich die Ausgabe von mktemp in einer Variablen erfassen. Von linuxmanpages :TMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE
bgvaughan
Eine andere übliche Methode ist die Verwendung der aktuellen Prozess-ID aus der Shell-Variablen $$:TMPFILE='/tmp/tmp.$$'; touch $TMPFILE
bgvaughan