2016-04-06 11 views
4

Ich kann laufen:Warum unterscheiden sich die MD5-Hashes von zwei Tarballs der gleichen Datei?

echo "asdf" > testfile 
tar czf a.tar.gz testfile 
tar czf b.tar.gz testfile 
md5sum *.tar.gz 

und es stellt sich heraus, dass a.tar.gz und b.tar.gz verschiedenen md5 Hashes haben. Es stimmt, dass sie anders sind, was diff -u a.tar.gz b.tar.gz bestätigt.

Welche zusätzlichen Flags muss ich an tar übergeben, damit seine Ausgabe konsistent im Laufe der Zeit mit dem gleichen Eingang?

+1

Der gzip-Header enthält die Änderungszeit der ursprünglichen Datei. Wenn die Eingabe von einem Stream kommt, anstatt eine Datei zu komprimieren, wird die aktuelle Zeit verwendet. – Barmar

+0

@Barmar: Danke. Weißt du, wie das nicht passieren kann? –

+0

Ich kann mir keinen guten Weg vorstellen. Ich wollte eine Antwort posten, wo du ein unkomprimiertes Tarball erstellst, kopiere es mit der '-p' Option, um' mtime' zu ​​erhalten, und komprimiere dann jedes von ihnen. Aber das Problem besteht darin, dass 'gzip' auch den Eingabedateinamen in die Datei einfügt und die Dateinamen unterschiedlich sind. – Barmar

Antwort

6

tar czf outfile infiles entspricht

tar cf - infiles | gzip > outfile 

Der Grund, warum die Dateien unterschiedlich sind, weil gzip seine Eingabe setzt Dateinamen und Änderungszeit in die komprimierte Datei. Wenn die Eingabe eine Pipe ist, wird eine leere Zeichenfolge als Dateiname und die aktuelle Zeit als Änderungszeit verwendet.

Aber es hat auch eine --no-name Option, die es sagt, den Namen und den Zeitstempel nicht in die Datei zu setzen. Wenn Sie also den erweiterten Befehl explizit schreiben, anstatt die -z-Option zu tar zu verwenden, können Sie diese Option verwenden.

tar cf - testfile | gzip --no-name > a.tar.gz 
tar cf - testfile | gzip --no-name > b.tar.gz 

Ich habe dies auf OS X 10.6.8 getestet und es funktioniert.

+0

Danke! Dies ist perfekt. –

+0

Wenn Sie dies bearbeiten, werde ich es upvote, meins war falsch. – Harry

+0

@Harry Ich habe es bearbeitet, um meine Tests zu erwähnen. – Barmar