Hallo allerseits,
beim Stammtisch am Mittwoch hatte ich gefragt, wie man bei zwei externen
Backup-Festplatten idiotensicher feststellen kann, welches Backup das
aktuelle ist.
Mit git und anschließendem Rückgriff auf die ctime von .git/index sollte
dabei nicht gearbeitet werden, weil git für Bild- und pdf-Dateien weder
gedacht noch gemacht ist.
Mit find ... -newer oder anderen Command Flags wollte ich nicht
arbeiten, da ich einen mehrfachen, iterativen Aufruf von find befürchtete.
Also habe ich mir folgendes zusammengebastelt:
#!/bin/bash
HDA=$(sudo ls -aclR --time-style=long-iso /Pfad/zu/HDA | grep -v :$ |
grep -v " \.\."$ | tr -s " " | cut -d" " -f6-7 | grep -v ^$ | sort -ur |
head -1)
HDB=$(sudo ls -aclR --time-style=long-iso /Pfad/zu/HDB | grep -v :$ |
grep -v " \.\."$ | tr -s " " | cut -d" " -f6-7 | grep -v ^$ | sort -ur |
head -1)
if [[ $HDA < $HDB ]] ; then
echo "HDB (Label=...) ist aktuell" # Backup entsprechend ausführen
else
echo "HDA (Label=...) ist aktuell" # Backup entsprechend ausführen
fi
exit
und möchte das kurz kommentieren:
sudo ... Alle Verzeichnisse auf der Backup-Festplatte sollen ohne
Fehlermeldung durchsucht werden.
ls -a ... auch "versteckte" Verzeichnisse und Dateien berücksichtigen
-c ... ctime ausgeben, was -l voraussetzt
-l ... s. unter -c
-R ... rekursiv vorgehen (alle Unterverzeichnisse berücksichtigen)
--time-style=long-iso ... gibt eine ctime analog zu "2023-10-27
10:44" (ohne die "") aus
grep -v :$ ... die "Überschriften" der Unterverzeichnisse werden nicht
gebraucht
grep -v " \.\."$ ... die ctime der jeweils übergeordneten Verzeichnisse
werden nicht gebraucht, da sie bereits durch ls -R erfaßt wurden.
Zugleich wird eine irreführende ctime herausgeworfen: Wenn HDA für das
Backup als /Pfad/zu/HDA eingehängt wird, erhält /Pfad/zu als ctime
Einhängedatum und -zeit von HDA. (Analog bei HDB.) Auf *das Einhängen*
der Backup-Festplatte aber kommt es nicht an – es wäre sogar
irreführend, wenn die aktuelle Backup-Platte als erste und die zu
aktualisierende Platte als zweite (damit neuer) im selben Verzeichnis
(bei externen Festplatten meist /media/<username>/) eingehängt wird.
tr -s " " ... mehrfache Leerzeichen wie in
drwx------ 3 root root 4096 2019-07-04 13:37 .dbus
-rw-r--r-- 1 jm jm 26 2023-08-04 16:24 .dmrc
zu einem zusammenziehen:
drwx------ 3 root root 4096 2019-07-04 13:37 .dbus
-rw-r--r-- 1 jm jm 26 2023-08-04 16:24 .dmrc
Schließlich soll der folgende cut-Befehl ja funktionieren.
cut -d" " -f6-7 ... Nachdem die Felder nur noch durch jeweils ein
Leerzeichen voneinander getrennt sind, ctime (Datum und Uhrzeit) extrahieren
grep -v ^$ ... Leerzeilen wegwerfen
sort -u ... mehrfach auftretende Zeilen nur einmal ausgeben (könnte
eigentlich entfallen, fällt mir gerade auf)
-r ... die Zeile mit der "größten" (neuesten) ctime als erste
ausgeben und ...
head -1 ... nur diese Zeile mit der "größten" (neuesten) ctime ausgeben
[[ $HDA < $HDB ]] ist ein lexikalischer Vergleich: Die spätere ctime ist
die größere, und die eigentlichen Backup-Befehle habe ich hier weggelassen.
Kommentare sind selbstverständlich erwünscht.
Viele Grüße
und schon einmal ein schönes Wochenende
Jakob