Frage

Ich möchten zu sagen, ob zwei tarball-Dateien enthalten identische Dateien, die in Bezug auf Dateinamen und Datei-Inhalte, nicht einschließlich meta-Daten, wie Datum, Benutzer, Gruppe.

Es gibt jedoch einige Einschränkungen:Erstens, ich habe keine Kontrolle, ob die meta-Daten enthalten ist, wenn Sie die tar-Datei, tatsächlich, die tar-Datei enthält immer die meta-Daten, also direkt diff die beiden tar-Dateien funktioniert nicht.Zweitens, weil einige tar-Dateien sind so groß, dass ich nicht leisten können, entpacken Sie Sie in ein temp-Verzeichnis und diff die enthaltenen Dateien eine nach der anderen.(Ich weiß, wenn ich kann entpacken Datei1.Teer in Datei1/ ich vergleichen kann durch Aufruf von 'tar -dvf Datei2.tar' in der Datei/.Aber normalerweise habe ich nicht leisten können, entpacken Sie auch einer von Ihnen)

Irgendeine Idee, wie kann ich die beiden vergleichen tar-Dateien?Es wäre besser, wenn es können erreicht werden innerhalb von SHELL-Skripten.Alternativ gibt es eine Möglichkeit, um jede sub-Datei-Prüfsumme, ohne tatsächlich zu entpacken ein tarball?

Vielen Dank,

War es hilfreich?

Lösung

tarsum ist fast, was Sie brauchen. Nehmen Sie seine Ausgabe, führen Sie es Art durch die Reihenfolge identisch auf jeder zu bekommen, und dann die beiden mit diff vergleichen. Das sollten Sie eine grundlegende Implementierung erhalten werde, und es wäre leicht genug, um diese Schritte in das Hauptprogramm zu ziehen, indem Sie den Python-Code zu modifizieren die ganze Arbeit zu tun.

Andere Tipps

steuern Sie die Erstellung dieser tar-Dateien?
Wenn ja, würde der Best Trick sein, um ein MD5-Prüfsumme erstellen und speichern sie in einer Datei im Archiv selbst. Dann, wenn Sie zwei Dateien vergleichen möchten, können Sie einfach diese Prüfsummen-Dateien extrahieren und sie vergleichen.


Wenn Sie es sich leisten können extrahieren nur eine TAR-Datei , Sie die --diff Möglichkeit tar verwenden können für Unterschiede mit den Inhalten anderer TAR-Datei zu suchen.


Ein gröber Trick , wenn Sie in Ordnung sind mit nur einem Vergleich der Dateinamen und die Größen .
Denken Sie daran, dies garantiert nicht, dass die anderen Dateien sind gleich!

Ausführen einer tar tvf den Inhalt jeder Datei auflisten und speichern Sie die Ausgänge in zwei verschiedenen Dateien. dann, in Scheiben schneidet alles neben den Dateinamen und Größe Spalten aus. Vorzugsweise sortieren auch die beiden Dateien. Dann, gerade zwischen den beiden Listen einer Datei diff tun.

Denken Sie daran, dass diese letzte Regelung nicht wirklich Prüfsumme tun.

Beispiel Teer und Ausgang (alle Dateien sind die Größe Null in diesem Beispiel).

$ tar tvfj pack1.tar.bz2
drwxr-xr-x user/group 0 2009-06-23 10:29:51 dir1/
-rw-r--r-- user/group 0 2009-06-23 10:29:50 dir1/file1
-rw-r--r-- user/group 0 2009-06-23 10:29:51 dir1/file2
drwxr-xr-x user/group 0 2009-06-23 10:29:59 dir2/
-rw-r--r-- user/group 0 2009-06-23 10:29:57 dir2/file1
-rw-r--r-- user/group 0 2009-06-23 10:29:59 dir2/file3
drwxr-xr-x user/group 0 2009-06-23 10:29:45 dir3/

Befehl sortiert Namen / Größe Liste erzeugen

$ tar tvfj pack1.tar.bz2 | awk '{printf "%10s %s\n",$3,$6}' | sort -k 2
0 dir1/
0 dir1/file1
0 dir1/file2
0 dir2/
0 dir2/file1
0 dir2/file3
0 dir3/

Sie können zwei solche sortierten Listen nehmen und diff sie.
Sie können auch die Datums- und Zeitspalten verwenden, wenn das für Sie arbeitet.

Versuchen Sie auch pkgdiff sichtbar zu machen Unterschiede zwischen den Paketen (erkennt hinzugefügt / entfernt / umbenannt Dateien und geänderte Inhalte, mit Null-Code bestehen, wenn unverändert):

pkgdiff PKG-0.tgz PKG-1.tgz

 image description hier

 image description hier

Hier ist meine Variante, wird die Unix-Rechteprüfung zu:

funktioniert nur, wenn die Dateinamen sind kürzer als 200 Zeichen.

diff <(tar -tvf 1.tar | awk '{printf "%10s %200s %10s\n",$3,$6,$1}'|sort -k2) <(tar -tvf 2.tar|awk '{printf "%10s %200s %10s\n",$3,$6,$1}'|sort -k2)

Ich begreife, dass dies eine späte Antwort, aber ich kam über den Faden, während Sie versuchen, das gleiche zu erreichen.Die Lösung, die ich implementiert haben-Ausgänge der Teer in stdout und übergibt es an welcher hash, die Sie wählen:

tar -xOzf archive.tar.gz | sort | sha1sum

Beachten Sie, dass die Reihenfolge der Argumente ist wichtig;besonders O die Signale stdout.

Tardiff , was Sie suchen? Es ist „ein einfacher Perl-Skript“, dass „den Inhalt von zwei tarballs und Berichten über alle Unterschiede zwischen ihnen. Gefunden vergleicht“

Wenn nicht die Archive zu extrahieren noch die Unterschiede benötigen, versuchen diff ‚s -q :

diff -q 1.tar 2.tar

Das Ruhe Ergebnis wird sein, "1.tar 2.tar unterscheiden" oder nichts, wenn es keine Unterschiede.

Es gibt Tool namens archdiff . Es ist im Grunde ein Perl-Skript, das in die Archive suchen.

Takes two archives, or an archive and a directory and shows a summary of the
differences between them.

Ich habe eine ähnliche Frage, und ich es von Python lösen, hier ist der Code. ps: obwohl dieser Code verwendet wird, zwei zipball Inhalt zu vergleichen, aber es ist ähnlich mit Tarball, hoffe, dass ich Ihnen helfen

import zipfile
import os,md5
import hashlib
import shutil

def decompressZip(zipName, dirName):
    try:
        zipFile = zipfile.ZipFile(zipName, "r")
        fileNames = zipFile.namelist()
        for file in fileNames:
            zipFile.extract(file, dirName)
        zipFile.close()
        return fileNames
    except Exception,e:
        raise Exception,e

def md5sum(filename):
    f = open(filename,"rb")
    md5obj = hashlib.md5()
    md5obj.update(f.read())
    hash = md5obj.hexdigest()
    f.close()
    return str(hash).upper()

if __name__ == "__main__":
    oldFileList = decompressZip("./old.zip", "./oldDir")
    newFileList = decompressZip("./new.zip", "./newDir")

    oldDict = dict()
    newDict = dict()

    for oldFile in oldFileList:
        tmpOldFile = "./oldDir/" + oldFile
        if not os.path.isdir(tmpOldFile):
            oldFileMD5 = md5sum(tmpOldFile)
            oldDict[oldFile] = oldFileMD5

    for newFile in newFileList:
        tmpNewFile = "./newDir/" + newFile
        if not os.path.isdir(tmpNewFile):
            newFileMD5 = md5sum(tmpNewFile)
            newDict[newFile] = newFileMD5

    additionList = list()
    modifyList = list()

    for key in newDict:
        if not oldDict.has_key(key):
            additionList.append(key)
        else:
            newMD5 = newDict[key]
            oldMD5 = oldDict[key]
            if not newMD5 == oldMD5:
            modifyList.append(key)

    print "new file lis:%s" % additionList
    print "modified file list:%s" % modifyList

    shutil.rmtree("./oldDir")
    shutil.rmtree("./newDir")

Es gibt auch diffoscope , die mehr generisch ist, und ermöglicht es Dinge rekursiv zu vergleichen (einschließlich verschiedenen Formate).

pip install diffoscope

Man kann ein einfaches Skript verwenden:

#!/usr/bin/env bash
set -eu

tar1=$1
tar2=$2
shift 2
tar_opts=("$@")

tmp1=`mktemp -d`
_trap="rm -r "$tmp1"; ${_trap:-}" && trap "$_trap" EXIT
tar xf "$tar1" -C "$tmp1"

tmp2=`mktemp -d`
_trap="rm -r "$tmp2"; ${_trap:-}" && trap "$_trap" EXIT
tar xf "$tar2" -C "$tmp2"

diff -ur "${tar_opts[@]:+${tar_opts[@]}}" "$tmp1" "$tmp2"

Verbrauch:

diff-tars.sh TAR1 TAR2 [DIFF_OPTS]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top