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

Antwort per Email an