Domanda

Voglio dire se due file tarball contengono file identici, in termini di nome e contenuto del file, esclusi i metadati come data, utente, gruppo.

Tuttavia, ci sono alcune restrizioni: in primo luogo, non ho alcun controllo sul fatto che i metadati siano inclusi durante la creazione del file tar, in realtà il file tar contiene sempre metadati, quindi la differenza diretta tra i due file tar non funziona. In secondo luogo, poiché alcuni file tar sono così grandi che non posso permettermi di decomprimerli in una directory temporanea e diffli i file contenuti uno per uno. (So ??se riesco a decomprimere file1.tar in file1 /, posso confrontarli invocando 'tar -dvf file2.tar' nel file /. Ma di solito non posso permettermi di decifrarne neanche uno)

Hai idea di come posso confrontare i due file tar? Sarebbe meglio se potesse essere realizzato all'interno degli script SHELL. In alternativa, c'è un modo per ottenere il checksum di ogni sotto-file senza effettivamente decomprimere un tarball?

Grazie,

È stato utile?

Soluzione

tarsum è quasi ciò di cui hai bisogno. Prendi il suo output, esegui l'ordinamento per ottenere l'ordinamento identico su ciascuno, quindi confronta i due con diff. Ciò dovrebbe portarti avanti un'implementazione di base e sarebbe abbastanza facile inserire questi passaggi nel programma principale modificando il codice Python per fare l'intero lavoro.

Altri suggerimenti

Stai controllando la creazione di questi file tar?
In tal caso, il trucco migliore sarebbe creare un checksum MD5 e memorizzarlo in un file all'interno dell'archivio stesso. Quindi, quando si desidera confrontare due file, è sufficiente estrarre questi file di checksum e confrontarli.


Se puoi permetterti di estrarre solo un file tar , puoi usare l'opzione --diff di tar per cercare differenze con il contenuto di altri file tar.


Un altro trucco approssimativo se stai bene con solo un confronto tra i nomi dei file e le loro dimensioni .
Ricorda, questo non garantisce che gli altri file siano uguali!

esegue un tar tvf per elencare il contenuto di ciascun file e memorizzare gli output in due file diversi. quindi, tagliare tutto oltre al nome del file e alle colonne delle dimensioni. Preferibilmente ordinare anche i due file. Quindi, fai un file diff tra le due liste.

Ricorda solo che quest'ultimo schema non fa realmente il checksum.

Esempio di tar e output (tutti i file hanno dimensione zero in questo esempio).

$ 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/

Comando per generare un elenco di nomi / dimensioni ordinato

$ 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/

Puoi prendere due di questi elenchi ordinati e diff.
Puoi anche utilizzare le colonne di data e ora se ciò funziona per te.

Prova anche pkgdiff per visualizzare le differenze tra i pacchetti (rileva file aggiunti / rimossi / rinominati e contenuti modificati, esiste con codice zero se invariato):

pkgdiff PKG-0.tgz PKG-1.tgz

 inserisci qui la descrizione dell'immagine

 inserisci qui la descrizione dell'immagine

Ecco la mia variante, sta controllando anche l'autorizzazione unix:

Funziona solo se i nomi dei file sono inferiori a 200 caratteri.

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)

Mi rendo conto che questa è una risposta tardiva, ma mi sono imbattuto nel thread mentre tentavo di ottenere la stessa cosa. La soluzione che ho implementato genera il tar su stdout e lo instrada a qualunque hash tu scelga:

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

Nota che l'ordine degli argomenti è importante; in particolare O che segnala l'uso di stdout.

tardiff è quello che stai cercando? È " un semplice script perl " che "confronta il contenuto di due tarball e riporta eventuali differenze riscontrate tra loro." "

Se non si estraggono gli archivi né si richiedono differenze, provare diff l'opzione -q :

diff -q 1.tar 2.tar

Questo silenzio sarà " 1.tar 2.tar differ & " o niente, se non differenze.

Esiste uno strumento chiamato archdiff . È fondamentalmente uno script perl che può guardare negli archivi.

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

Ho una domanda simile e la risolvo con Python, ecco il codice. ps: sebbene questo codice sia usato per confrontare due contenuti di zipball, ma è simile a tarball, spero di poterti aiutare

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")

Esiste anche diffoscope , che è più generico e consente di confrontare le cose in modo ricorsivo (compresi vari formati).

pip install diffoscope

Si può usare un semplice script:

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

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

tmp1=`mktemp -d`
_trap="rm -r "$tmp1"; ${_trap:-}" && trap "

Si può usare un semplice script:

diff-tars.sh TAR1 TAR2 [DIFF_OPTS]

Utilizzo:

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

Si può usare un semplice script:

<*>

Utilizzo:

<*>trap" EXIT tar xf "$tar2" -C "$tmp2" diff -ur "${tar_opts[@]:+${tar_opts[@]}}" "$tmp1" "$tmp2"

Utilizzo:

<*>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top