Ich habe zwei *.tar
Dateien mit ähnlichem Inhalt. Ich möchte überprüfen, welche Dateien gleich sind. Viele der Dateien sind groß, sodass ich zum Vergleichen der Hashes jede Datei aus jedem Tar extrahieren und den Hash berechnen müsste. Gibt es eine Möglichkeit, Dateien in einem Tar zu hashen, ohne es extrahieren zu müssen? Gibt es eine andere Möglichkeit, Dateien zwischen zwei *.tar
Dateien zu vergleichen?
Antwort1
Wenn es GNU Tar ist, führen Sie Folgendes aus:
tar -xf file1.tar --to-command=file-stats-from-tar
wo sich file-stats-from-tar irgendwo befindet $PATH
und lautet:
#!/bin/bash
md5=`md5sum`;
md5=${md5%% *}
printf "%s\t%s\n" $md5 "$TAR_FILENAME"
Ändern Sie es md5sum
, wenn nötig.
Damit wird alles in einem einzigen Durchgang erledigt.
Die Funktion funktioniert so, dass die --to-command
Option tar anweist,jedeDatei separat zu dem von Ihnen angegebenen Befehl, mit einer Reihe festgelegter Umgebungsvariablen (die wir nur TAR_FILENAME
hier verwenden).
Antwort2
Es mag effizientere Wege geben, aber mir ist in wenigen Augenblicken Folgendes eingefallen:
tar tf test.tar | while read x ; do echo "$(tar xfO test.tar ${x} | md5sum) ${x}" ; done
Das erste tar tf
listet einfach die Dateien im Archiv auf, das dann an die while read x
Bash-Schleife übergeben wird. Für jeden Dateinamen findet es dann den Hash mit tar xfO test.tar ${x} | md5sum
Sie könnten md5sum natürlich durch Ihr bevorzugtes Hash-Tool ersetzen. Die seltsame Verwendung von echo $() ${x}
besteht nur darin, die Ausgabe ähnlich einer regulären Hash-Ausgabe zu halten, mit den Werten auf der linken und den Dateinamen auf der rechten. Ohne diese Funktion erhalten Sie nur die Hashes aller Dateien, aber keine Namen, sodass Sie nicht sagen können, welche zu welcher gehört. Selbst mit dieser Funktion gibt es -
in der Ausgabe eine zusätzliche Spalte von, die normalerweise nicht vorhanden ist. Sie könnte mit einem Befehl in der Pipeline leicht entfernt werden colrm
.
Dies ist möglicherweise nicht die effizienteste Lösung, da die TAR-Datei n+1 Mal durchsucht werden muss, wenn sie n Dateien enthält. Hoffentlich wird der TAR-Inhalt jedoch nach dem ersten Durchlesen zwischengespeichert.