Kann ich einen Befehl ausführen, der den sha256 einer Datei nur hinzufügt, wenn sie geändert wurde?

375
MarianoM

Ist es möglich, einen Befehl auszuführen, der das sha256 einer Datei in der zuvor erstellten Liste hinzufügt, und nur dann, wenn diese entsprechend dem zuletzt in dieser Liste registrierten Datum geändert wurde?

Ich weiß nicht, ob sie mich verstehen. Ich möchte eine sha256-Liste aller Dateien zusammen mit den Änderungsdaten erstellen.

Um die Liste auf dem neuesten Stand zu halten, anstatt alle Dateien durchzugehen (ein Vorgang, der viel Zeit und Festplattennutzung in Anspruch nehmen würde), würde ich einen Befehl benötigen, der die Änderungsdaten in der mit der aktuellen Änderung erstellten Liste vergleicht Datumsangaben für jede der Dateien auf der Festplatte. Wenn eine Änderung erkannt wird, generiert das Programm die Datei sha256 und registriert sie erneut in der Liste. Dabei wird der vorherige Wert (nur dieser Datei) überschrieben.

Gibt es ein Programm, das diese oder eine Idee macht?

Aktualisieren:

Was ich brauche, ist ein Programm, das zusätzlich zum Erstellen des SHA das zu jeder Datei gehörende Änderungsdatum registriert.

Z.B:

Inhalt der Datei database_of_SHA256.txt:

0adca15c96d77a38aa0447fa87af9c297c * document1.txt 2018-12-03 04:12:23 dca15c96d77a9d30d2a7defad30d2a47fa * document2.txt 2018-09-09 10:19:11 77a915c9defad30d2c96d77aa0447fa87a * document3.txt 2017-01-20 17:34:04 

Der Code, den Sie tun sollten, ist: Ich weiß nicht, ob er am besten geeignet ist. Sie sollten jedoch eine Liste mit Datumsangaben und Namen aller Dateien auf dem Computer erstellen und diese mit diesen Daten vergleichen. Wenn die Daten unterschiedlich sind, sollten Sie die Prüfsumme generieren und überprüfen.

Wenn die Prüfsumme nicht übereinstimmt, bedeutet dies, dass die Datei tatsächlich geändert wurde und diese Liste mit den neuen Informationen aktualisiert werden muss (es ist ratsam, dafür eine Bestätigung anzufordern), wenn der Benutzer bestätigt, dass er fortfahren möchte Dann wird die Liste aufgenommen. neues Datum und Prüfsumme der Datei.

1

1 Antwort auf die Frage

2
Eugen Rieck

Mit einem Shell-Skript können Sie das leicht erreichen:

  • Vergleichen Sie die Änderungszeit der Dateien mit der der Liste (oder dem registrierten Zeitpunkt).
  • Wenn eine Datei neuer als die Liste ist, führen Sie sha256sumsie aus und ersetzen Sie sie in der Liste

Etwas in der Richtung von

HASHCHANGED=$(stat -c '%Y' "/path/to/listfile") # Or extract the timestamp from the list for FILE in /path/to/files/* ; do FILECHANGED=$(stat -c '%Y' "$FILE") if test $FILECHANGED -ge $HASHCHANGED; then NEWHASH=$(sha256sum "$FILE") # put the hash into your list, this depends on the list format fi done 

BEARBEITEN

Aus den Kommentaren verstehe ich, dass es kein vordefiniertes Listenformat gibt, wie ich es von der OQ angenommen hatte. Daher ist es normal, das Standardformat zu sha256sumverwenden. Wir können das Skript jetzt von oben auf eine vollständige Lösung erweitern:

# Configuration HASHFILE="/path/to/hashfile" FILEMASK="/path/to/files/*.suffix"  HASHCHANGED=$(stat -c '%Y' "$HASHFILE") while read FILE ; do test -f "$FILE" || continue FILECHANGED=$(stat -c '%Y' "$FILE") if test $FILECHANGED -ge $HASHCHANGED; then NEWHASH=$(sha256sum "$FILE") cat "$HASHFILE" | grep -ve "\\s$FILE\$" > "$HASHFILE.tmp" echo "$NEWHASH" >> "$HASHFILE.tmp" cat "$HASHFILE.tmp" | sort -u > "$HASHFILE" fi done < <(eval "ls -1 $FILEMASK") #Need an eval here to allow * in mask 

Sie sollten die ursprüngliche Liste mit säen sha256sum /path/to/files/*mask

Interessant für denjenigen, der weiß, aber nicht für Neulinge wie mich. Ich weiß immer noch nicht, wie ich die Liste mit den Datumsangaben für jede Datei erstellen soll, und ich verstehe nicht, wo ich die Liste in Ihren Code aufnehmen soll. Sie sind nicht schuld daran, dass ich das fragte, haha. Ich werde versuchen, mehr über den Code zu erfahren und zu sehen, ob ich ihn erreichen kann. MarianoM vor 6 Jahren 0
@ MarianoM meine Bearbeitung sehen Eugen Rieck vor 6 Jahren 0
Danke Eugen! Nachdem ich mich bemüht habe, es funktionieren zu lassen und Zeile für Zeile zu testen, weil das Skript eingefroren war, analysierte ich den Code nach meinem begrenzten Wissen und stellte fest, dass Sie das Datum der Hash-Datei vergleichen in der Liste mit dem Datum der Datei. Wenn das Datum unterschiedlich ist, wird die neue Prüfsumme generiert und in der Liste neben dem aktualisierten Datum registriert. MarianoM vor 6 Jahren 0
Sie haben den Übersetzer möglicherweise falsch verstanden. Das While in Großschreibung ist nicht funktionsfähig und das erledigte gibt mir einen unerwarteten Fehler, ich habe es auf verschiedene Weise und Zeile für Zeile versucht, nur dadurch, dass ich einen Fehler bekomme. MarianoM vor 6 Jahren 0
Fügen Sie einige Details hinzu, um zu sehen, ob es besser verstanden wird. MarianoM vor 6 Jahren 0
@MarianoM das "While" war ein Tippfehler, "While" ist richtig (Kleinbuchstabe w) Eugen Rieck vor 6 Jahren 0