Verzeichnis nach Datumszeichenfolge einer Datei in diesem Verzeichnis sortieren

Verzeichnis nach Datumszeichenfolge einer Datei in diesem Verzeichnis sortieren

Das bereitet mir Kopfschmerzen. Ich versuche, eine Reihe von Verzeichnissen nach einer Datei zu sortieren, die sich in diesem Verzeichnis befindet und das Erstellungsdatum der Sicherung enthält.

Dies dient der Ordnung meiner Backups. Ich kann dies nicht mit der Ctime oder Atime des Verzeichnisses tun, da sie gleichzeitig auf einen anderen Host kopiert werden.

Nehmen wir an, ich habe die folgende Struktur:

/backups/full
/backups/incremental1
/backups/incremental2
/backups/incremental3
...

Und in diesen Backup-Verzeichnissen haben wir:

/backups/full/date.txt
/backups/incremental1/date.txt
/backups/incremental2/date.txt
..

Und in dieser Datei haben wir für jeden date.txteine Zeichenfolge wie folgt :.creation_time = 2020-04-03 15:26:19

Wie könnte ich ein Skript erstellen, um diese Verzeichnisse nach ihrer Erstellungszeit zu sortieren und sie in ein Array zu setzen, damit ich ein

array=(full incremental1 incremental2 incremental3)

for dir in @{array[@]}; do

Ich möchte sie in einer Variablen oder einem Array angeordnet haben

Antwort1

Vorausgesetzt, die Struktur date.txtist immer gleich und die Verzeichnisnamen enthalten keine Zeilenumbrüche, sollte etwa Folgendes funktionieren:

for d in /backups/*/date.txt; do
    printf '%s\t%s\n' "$(grep creation_time "$d")" "$(basename "$(dirname "$d")")"
done | sort | cut -f2-

Ausgabe:

full
incremental1
incremental2
incremental3

Das Einfügen in ein Array sollte relativ einfach sein, aber wahrscheinlich werden Sie das nicht brauchen, da Sie das Ergebnis z. B. in eine whileSchleife oder xargsÄhnliches einspeisen könnten.

Antwort2

Arbeiten mit dem Zeitstempel der letzten Änderung der date.txtDateien in der zshShell:

for backupdir in /backup/*/date.txt(ome['REPLY=$REPLY:h']); do
    # do whatever you need to do
    # with the directory path in $backupdir
done

Dabei wird ein Globbing-Muster verwendet, um alle Dateien abzugleichen date.txt. Der Globbing-Qualifizierer am Ende des Musters sortiert die Übereinstimmungen so, dass die zuletzt geänderte Übereinstimmung zuerst kommt (dies ist, was ompassiert), und entfernt die /date.txtZeichenfolge aus dem übereinstimmenden Pfadnamen (wie es dirnamepassieren würde).

Dies setzt natürlich voraus, dass die date.txtDateien aktualisiert wurden, als das Datum in die Datei geschrieben wurde (ungefähr zur gleichen Zeit, als die Sicherung erstellt wurde). Dieser Zeitstempel (sowie die Zeitstempel des Verzeichnisses) bleiben erhalten, wenn Sie die Daten mit kopieren rsync --archive.

Aus bash:

zsh -c '
for backupdir in /backup/*/date.txt(ome['\''REPLY=$REPLY:h'\'']); do
    # do whatever you need to do
    # with the directory path in $backupdir
done'

verwandte Informationen