Wiederherstellen von Dateieigenschaften, jedoch nicht die vollständigen Dateien, aus der Sicherung

274
Jon

Beim Kopieren von Daten von meinem alten Speicher auf einem Linux-Computer auf den neuen (Linux-basierten) NAS habe ich versehentlich die Eigenschaften (am wichtigsten: Änderungsdatum) an den neuen Speicherort nicht übertragen. Ich habe die Dateien auch weiterhin am neuen Speicherort verwendet / modifiziert und kann sie daher nicht noch einmal kopieren.

Was ich gerne tun würde, ist ein Unterschied zwischen den Dateien im alten und im neuen Speicher. Wenn diese identisch sind, stellen Sie die Eigenschaften des Linux-Speichers in den NAS-Speicherdateien wieder her.

Gibt es eine clevere Art, wie ein Skript oder ein Werkzeug, um dies zu tun? Ich könnte es entweder auf der Linux-Box oder im schlimmsten Fall von einem entfernten Windows-Computer ausführen.

Für Anregungen dankbar. / Jon

2
Sie könnten * einen * kryptographischen Hash auf den Dateien ausführen (vielleicht SHA1), beide Hashes der Dateien vergleichen und bei identischem `touch -m 'die NAS-Datei (mit den entsprechenden Datums- und Uhrzeiteinstellungen) vergleichen. Es wäre ein Hack, aber ich denke, es würde funktionieren. Elliott Frisch vor 10 Jahren 0
Hallo Elliott, Danke für den Vorschlag. Ja, ich werde wahrscheinlich ein paar Stunden brauchen, um eine solche Lösung zu erstellen. Ich hatte gehofft, ich könnte faul sein und dafür ein bereits vorhandenes Werkzeug nutzen, aber als zweite Möglichkeit ist Ihre Idee gut. Jon vor 10 Jahren 0

1 Antwort auf die Frage

0
Jon

Ich dachte nur, ich sollte den Code, den ich mir vorgestellt habe, besser mitteilen. Obwohl ich kein bash-Programmierer bin, gibt es eine Menge Wissen über Google, daher glaube ich, dass dieser Code die Arbeit für mich erledigen wird. Grundsätzlich ist es:

  • Durchlaufen Sie alle Dateien und Ordner am neuen Speicherort und für jede:
    • Prüfen Sie, ob am alten Speicherort dieselbe Datei vorhanden ist
      • Wenn nein, schreibe einen Protokolleintrag
      • Wenn ja, stimmt der Zeitstempel (Änderungsdatum) überein?
        • Ja - nichts als einen Protokolleintrag schreiben
        • Nein, die Zeitstempel stimmen nicht überein
          • Ist es entweder ein Verzeichnis oder ist der Inhalt der Datei identisch? Setzen Sie dann den Zeitstempel auf den Zeitstempel der Datei am alten Speicherort zurück und schreiben Sie einen Protokolleintrag
          • Wenn sich der Dateiinhalt unterscheidet, können die Zeitstempel ebenfalls funktionieren. Schreiben Sie einfach einen Protokolleintrag.

Code:

shopt -s globstar  NEWDIR="/home/jon" OLDDIR="/tmp/jon_old" LOGFILE=restoreDates_$(date "+%Y-%m-%d-%H%M%S").log  echo $LOGFILE > $LOGFILE  for f in "$NEWDIR"/** ; do OLDFILE=$(sed -e "s/$NEWDIR/$OLDDIR/" <<< $f)  # Does corresponding file exist in old directory?  if [ -a "$OLDFILE" ] ; then  # Do both files have the same modify date? if [ $(stat -c %Y "$f") -eq $(stat -c %Y "$OLDFILE") ] ; then echo "$OLDFILE already has same modify date/time as $f" >> $LOGFILE else  # Is this a directory? if [ -d "$f" ]; then echo "$f is a directory, modify timestamp will be reset to that of $OLDFILE; $(stat -c %y "$OLDFILE")" >> $LOGFILE touch -r "$OLDFILE" "$f" else # Not a directory - Is old file equal to the new? if $(cmp --silent "$f" "$OLDFILE"); then # yes echo "$OLDFILE and $f are identic, modify timestamp will be reset to $(stat -c %y "$OLDFILE")" >> $LOGFILE touch -r "$OLDFILE" "$f" else # File has changed echo "$OLDFILE differs from $f, which must have changed" >> $LOGFILE fi fi fi else # File does not exist in old directory echo "$OLDFILE does not exist (but $f do)" >> $LOGFILE fi  done; 

Kommentare zum Code sind willkommen.

Ich entschuldige mich für die obige Darstellung des Codes - ich konnte nicht alles in die Code-Box bringen ... Jon vor 9 Jahren 0