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.txt
eine 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.txt
ist 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 while
Schleife oder xargs
Ähnliches einspeisen könnten.
Antwort2
Arbeiten mit dem Zeitstempel der letzten Änderung der date.txt
Dateien in der zsh
Shell:
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 om
passiert), und entfernt die /date.txt
Zeichenfolge aus dem übereinstimmenden Pfadnamen (wie es dirname
passieren würde).
Dies setzt natürlich voraus, dass die date.txt
Dateien 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'