staging.inyokaproject.org

Timestamp beim Verschieben

Status: Gelöst | Ubuntu-Version: Server 22.04 (Jammy Jellyfish)
Antworten |

gnude

Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 766

Hallo, ich möchte beim Verschieben von Dateien diesen gerne einen Timestamp anhängen, mit Datum, Uhzeit, Milisekunden, ich erzeuge eine Status-Datei die ich zu Archivzwecken verwahren möchte. Damit die alte Datei nicht überschrieben wird möchte ich diese mit einem Timestamp versehen.

Beispiel:

mv /datei/erstelltedatei.txt /archiv/

Nun würde die alte Datei ja immer überschrieben. Daher meine Idee mit dem Timestamp.... das im ARchiv dann die Datei Steht im Format erstelltedateiYYYYMMDDHHMMSSMiSek Also Dateiname + Jahr + Monat + Tag + Stunden + Minuten + Sekunden + Milisekunden

ChickenLipsRfun2eat Team-Icon

Supporter
Avatar von ChickenLipsRfun2eat

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12070

mv DATEI $(date '+%Y%m%d%H%m%S%N')DATEI

→ man date

Ich würde %s in Erwägung ziehen, also den Zeitstempel als Integer. Millisekunden müsstest du selbst berechnen.

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 766

Das klappt. Aber eine andere Frage.... wenn ich mehrere Dateien nehmen möchte....

Ohne Zeitstempel ist es leicht:

mv /daten/*.txt /archiv/

Aber mit Zeitstempel geht der Wildcard "*" ja nicht. Glaub da müsste ich alle Dateien mit einer FOR Schleife abgreifen, aber wie würde so ein Konstrukt aussehen?

ChickenLipsRfun2eat Team-Icon

Supporter
Avatar von ChickenLipsRfun2eat

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12070

Kommt ein wenig drauf an. Du kannst das mit rsync (hacky über Verzeichnisse mit X-dest=ORDNER), find exec, etc. umsetzen. Ich würde allerdings zu git tendieren um Revisionen zu haben, anstatt ein Umbenennenchaos zu starten. Dafür isses ja da und du hast auch keine Probleme beim Wiederherstellen, was mit deinem Ansatz auch wieder in Arbeit ausartet.

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 766

Tendenziell ist das richtig und GIT ist eine gute Lösung. Aber für meine Problemstellung passt es leider nicht. Die Daten die ich bearbeite liegen auf einer Windows Freigabe und werden auch dort verarbeitet. Im Grunde legt ein Programm eine DAtei an. Ich habe ein kleines Tool als Cronjob was die DAteien einfach mit Timestamp in ein Archiv legen soll, Git währe da nicht passend. Was ich bräuchte ist ein kleines Script das jede Textdatei im Verzeichnis der Reihe nach verschiebt und dann mit dem Timestamp versieht.

ChickenLipsRfun2eat Team-Icon

Supporter
Avatar von ChickenLipsRfun2eat

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12070

https://backuppc.github.io/backuppc/ könnte da helfen. Das erfordert keinen Klienten und kann die Freigabe auf dem Host sichern. Ansonsten warte auf andere, ich hab keine Ahnung wie sich Windows-Freigaben verhalten.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Oder gleich Borg Backup nehmen. Dann wird auch das automatische Aufräumen einfach und man hat Deduplikation dabei, so dass der Platzbedarf für die Backups relativ klein ist.

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 766

So, ich habe folgende Lösung gefunden:

1
2
3
4
5
cd /daten
 for x in *.txt;
  do mv "$x" /archiv/"${x%.*}"(date '++%Y%m%d%H%m%S%N').txt;
  done
cd /

Das macht vom Inhalt her genau das was ich möchte. Ein Programm wie Borg-Backup währe für diesen Anwendungsbereich nicht passend. Danke für die Hilfe die mich auf den richtigen Weg gebracht hat.

Bearbeitet von rklm:

Syntaxhighlighting

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Da fehlt ein $ bei der Command Substitution mit date. Ich würde sowieso auch den Zeitstempel sichern - zumindest ist es dann am leichtesten, alle Verschiebungen eines Batches zu finden, weil sie alle den selben Zeitstempel haben.

Du solltest in dem Skript sicher stellen, dass der erste cd funktioniert hat. Sonst verschiebst Du ggf. Dateien, die Du gar nicht verschieben willst. Ich nutze dafür oft den set -e, weil das sicherstellt, dass das Skript abbricht, sobald ein Fehler aufgetreten ist. Also:

1
2
3
4
5
6
7
8
set -e
cd /daten

ts=$(date '++%Y%m%d%H%m%S%N')

for x in *.txt; do
  mv "$x" "/archiv/${x%.txt}$ts.txt"
done

Der zweite cd ist überflüssig.

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 766

Danke für den Hinweis! ☺ 👍

rklm schrieb:

Da fehlt ein $ bei der Command Substitution mit date. Ich würde sowieso auch den Zeitstempel sichern - zumindest ist es dann am leichtesten, alle Verschiebungen eines Batches zu finden, weil sie alle den selben Zeitstempel haben.

Du solltest in dem Skript sicher stellen, dass der erste cd funktioniert hat. Sonst verschiebst Du ggf. Dateien, die Du gar nicht verschieben willst. Ich nutze dafür oft den set -e, weil das sicherstellt, dass das Skript abbricht, sobald ein Fehler aufgetreten ist. Also:

1
2
3
4
5
6
7
8
set -e
cd /daten

ts=$(date '++%Y%m%d%H%m%S%N')

for x in *.txt; do
  mv "$x" "/archiv/${x%.txt}$ts.txt"
done

Der zweite cd ist überflüssig.

Antworten |