Stellen Sie fest, ob Dateien in einem Verzeichnis hinzugefügt, entfernt oder geändert wurden

StackOverflow https://stackoverflow.com/questions/7325072

Frage

Ich versuche, ein Python -Skript zu schreiben, das das MD5SUM aller Dateien in einem Verzeichnis (unter Linux) erhält. Was ich glaube, ich habe im Code unten gemacht.

Ich möchte in der Lage sein, dies auszuführen, um sicherzustellen, dass sich keine Dateien im Verzeichnis geändert haben und keine Dateien für das Löschen hinzugefügt wurden.

Das Problem ist, wenn ich eine Datei im Verzeichnis wechsle, aber dann wieder ändere. Ich erhalte ein anderes Ergebnis als das Ausführen der Funktion unten. (Obwohl ich die geänderte Datei zurückgeändert habe.

Kann jemand das erklären? Und lassen Sie mich wissen, ob Sie an eine Arbeit vorstellen können?

def get_dir_md5(dir_path):
    """Build a tar file of the directory and return its md5 sum"""
    temp_tar_path = 'tests.tar'
    t = tarfile.TarFile(temp_tar_path,mode='w')  
    t.add(dir_path)
    t.close()

    m = hashlib.md5()
    m.update(open(temp_tar_path,'rb').read())
    ret_str = m.hexdigest()

    #delete tar file
    os.remove(temp_tar_path)
    return ret_str

Bearbeiten:Da diese schönen Leute geantwortet haben, sieht es so aus, als hätte Tar Headerinformationen wie Datum geändert. Würde die Verwendung von Reißverschluss anders oder ein anderes Format funktionieren?

Irgendwelche anderen Ideen für die Arbeit?

War es hilfreich?

Lösung

Wie die anderen Antworten erwähnt, können zwei TAR -Dateien unterschiedlich sein, selbst wenn der Inhalt aufgrund von TAR -Metadatenänderungen oder Änderungen der Reihenfolge gleichermaßen gleich sind. Sie sollten die Prüfsumme in den Dateidaten direkt ausführen und die Verzeichnislisten sortieren, um sicherzustellen, dass sie immer in derselben Reihenfolge sind. Wenn Sie Metadaten in die Prüfsumme einbeziehen möchten, geben Sie diese manuell ein.

Ungetestete Beispiel verwendet os.walk:

import os
import os.path
def get_dir_md5(dir_root):
    """Build a tar file of the directory and return its md5 sum"""

    hash = hashlib.md5()
    for dirpath, dirnames, filenames in os.walk(dir_root, topdown=True):

        dirnames.sort(key=os.path.normcase)
        filenames.sort(key=os.path.normcase)

        for filename in filenames:
            filepath = os.path.join(dirpath, filename)

            # If some metadata is required, add it to the checksum

            # 1) filename (good idea)
            # hash.update(os.path.normcase(os.path.relpath(filepath, dir_root))

            # 2) mtime (possibly a bad idea)
            # st = os.stat(filepath)
            # hash.update(struct.pack('d', st.st_mtime))

            # 3) size (good idea perhaps)
            # hash.update(bytes(st.st_size))

            f = open(filepath, 'rb')
            for chunk in iter(lambda: f.read(65536), b''):
                hash.update(chunk)

    return hash.hexdigest()

Andere Tipps

TAR -Datei -Header enthalten ein Feld für die geänderte Zeit der Datei; Das Ändern einer Datei, auch wenn diese Änderung später geändert wird, bedeutet, dass die TAR -Datei -Header unterschiedlich sein und zu verschiedenen Hashes führen.

Sie müssen die TAR -Datei nicht erstellen, um das zu tun, was Sie vorschlagen.

Hier ist Ihr Workaround -Algorithmus:

  1. Gehen Sie den Verzeichnisbaum;
  2. Nehmen Sie die MD5 -Signatur jeder Datei;
  3. Sortieren Sie die Unterschriften;
  4. Nehmen Sie die MD5 -Signatur der Textzeichenfolge aller Signaturen der einzelnen Dateien.

Die einzelne resultierende Signatur wird das sein, wonach Sie suchen.

Heck, du brauchst nicht einmal Python. Du kannst das:

find /path/to/dir/ -type f -name *.py -exec md5sum {} + | awk '{print $1}'\
| sort | md5sum

tar Dateien enthalten Metadaten über den tatsächlichen Dateiinhalt hinaus, z. B. Dateizugriffszeiten, Änderungszeiten usw. Auch wenn sich der Dateiinhalt nicht ändert, ist die tar Die Datei wird in der Tat anders sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top