Programm zum Vergleichen von Images (1TB) gesucht (Windows)

INe5xIlium

Lt. Commander
Registriert
Aug. 2010
Beiträge
1.076
Hallo,
ich habe 2 AOMEI Image Dateien von jeweils 1TB und möchte gerne wissen, ob die identisch sind.

Früher hatte ich mal eine Browser Extension, die mir Checksummen berechnet hat. Wenn es einen halben Tag dauert, ist eine Browser Extension nicht optimal, finde ich.

Jetzt habe ich WinMerge verwendet, weil ich es grade hatte. Er vergleicht schon seit 12 Stunden File 1/1. Da hätte ich mindestens gerne einen Progress. Der TaskManager zeigt mir noch immer 100% Disk-Auslastung an. Weil beide Images auf der gleichen Platte liegen, macht die nur 40MB/s, statt die ~200MB/s, wie sonst.

Ich würde aber gerne wissen, ob die Images noch identisch sind. Welches Programm würdet ihr dafür emfpehlen? Die KI empfiehlt BeyondCompare, aber ist das wirklich anders als WinMerge?
 
PowerShell:
$file1 = "C:\Path\To\File1.txt"
$file2 = "C:\Path\To\File2.txt"

$hash1 = Get-FileHash -Path $file1 -Algorithm SHA256
$hash2 = Get-FileHash -Path $file2 -Algorithm SHA256

if ($hash1.Hash -eq $hash2.Hash) {
    Write-Output "The files are identical (hashes match)."
} else {
    Write-Output "The files are different (hashes do not match)."
}

E: ungetestet, aus KI rausgepurzelt:
PowerShell:
function Get-FileHashWithProgress {
    param (
        [string]$FilePath,
        [string]$Algorithm = "SHA256"
    )

    if (-not (Test-Path $FilePath)) {
        Write-Error "File not found: $FilePath"
        return $null
    }

    $bufferSize = 4MB
    $stream = [System.IO.File]::OpenRead($FilePath)
    $hasher = [System.Security.Cryptography.HashAlgorithm]::Create($Algorithm)
    $buffer = New-Object byte[] $bufferSize
    $totalBytes = $stream.Length
    $readBytes = 0

    while (($bytesRead = $stream.Read($buffer, 0, $bufferSize)) -gt 0) {
        $hasher.TransformBlock($buffer, 0, $bytesRead, $buffer, 0)
        $readBytes += $bytesRead
        $percentComplete = [math]::Round(($readBytes / $totalBytes) * 100, 2)
        Write-Progress -Activity "Hashing $FilePath" -Status "$percentComplete% Complete" -PercentComplete $percentComplete
    }

    $hasher.TransformFinalBlock($buffer, 0, 0)
    $stream.Close()

    return ($hasher.Hash | ForEach-Object { $_.ToString("x2") }) -join ""
}

# Paths to the files
$file1 = "C:\Path\To\File1.txt"
$file2 = "C:\Path\To\File2.txt"

# Get hashes with progress
$hash1 = Get-FileHashWithProgress -FilePath $file1
$hash2 = Get-FileHashWithProgress -FilePath $file2

# Compare
if ($hash1 -eq $hash2) {
    Write-Output "The files are identical (hashes match)."
} else {
    Write-Output "The files are different (hashes do not match)."
}
 
Zuletzt bearbeitet: (Den Fortschritt kann es allerdings nicht zeigen, dafür wir es etwas komplexer)
  • Gefällt mir
Reaktionen: Nilson, recu, GTrash81 und 3 andere
7zip z.b. kann die prüfsummen über das kontextmenü berechnen. ohne extra-programme geht es z.b. mit certutil oder über die powershell.
 

Anhänge

  • 1756214409867.png
    1756214409867.png
    85,7 KB · Aufrufe: 60
  • Gefällt mir
Reaktionen: gaym0r und GTrash81
Das hat auf alle Fälle den Vorteil, dass es nacheinander den Hash berechnet und dadurch locker 5x schneller ist (falls die Dateien identisch sind). Bei unterschiedlicher Größe verliert man den Vorteil, dass der Prozess schon früher abgebrochen wird.

Gibt Get-FileHash bei der Größe eine Fortschrittsanzeige raus? Dann wäre das schon die Lösung. Statt 10 Stunden zu warten und nicht zu wissen, was los ist, würde ich den Dateipfad auch manuel kopieren. Wäre nur blöd, wenn man sich beim zweiten Pfad vertippt ^^
 
Nen Fortschritt bei hashes berechnen anzeigen wird mathematisch nix
 
  • Gefällt mir
Reaktionen: Asghan und areiland
0x8100 schrieb:
7zip z.b. kann die prüfsummen über das kontextmenü berechnen.
Der Teil, dass er das extra in eine Datei speichert, finde ich auch gut. Dann muss man es nicht nochmal machen, wenn man es vergisst.
Fortschrittsbalken hat es auch und ich habe es schon installiert. Irgendwie habe ich auch das Gefühl, dass der schneller ist als Winmerge. Bin mir nur nicht sicher, ob ich nach 12 Stunden nochmal das Programm wechseln sollte. Beim nächsten Mal ist es mindestens 7Zip. Das hab ich eh schon und es ist leichter als das manuelle Abschreiben vom Dateipfad.
Ergänzung ()

madmax2010 schrieb:
Nen Fortschritt bei hashes berechnen anzeigen wird mathematisch nix
Das musst du mir erklären. Der weiß doch wie groß die Datei ist.

Edit: Habs über den Daumen gepeilt und es macht mehr Sinn den Prozess nach 12h mit WinMerge abzubrechen und mit 7Zip neu zu starten.
:D Gibt es diesen Geschwindigkeitszuwachs auch beim Vergleichen von Verzeichnisstrukturen? Ist Winmerge einfach so schlecht?
 
https://github.com/namazso/OpenHashTab
Das ist wohl der Nachfolger von HashTab und wird aktiv entwickelt.
Integriert sich in den Explorer und du kannst die Hashes in den Eigenschaften der Dateien aufrufen.

P.S.: Habe es selber nicht getestet aber ich mochte damals HashTab sehr.

1756215005192.png
 
  • Gefällt mir
Reaktionen: recu und Fusionator
orioon schrieb:
P.S.: Habe es selber nicht getestet aber ich mochte damals HashTab sehr.
Ich glaube, ich auch. Aber bei kleinen Dateien brauchte ich es nicht wirklich. Bei großen Dateien hing es irgendwie, da finde ich 7Zip jetzt echt gut. Aber danke für den Hinweis. Vielleicht probiere ich es mal.
 
Der Total Commander kann auch Dateien vergleichen. Aber bei 1TB muss ja beide gesamte Datein "durchgelesen" werden. Das geht bei jedem Programm nur mit der maximal möglichen Lesegeschwindigkeit.
 
  • Gefällt mir
Reaktionen: User007
Mercator schrieb:
Das geht bei jedem Programm nur mit der maximal möglichen Lesegeschwindigkeit.
Darum geht es mir, das hätte ich unterstreichen müssen. WinMerge springt so zwischen den Dateien herum, dass er nicht über 20% Lesegeschwindigkeit kommt. WinZip vergleicht die Dateien in 3 Stunden und nach 12 Stunden Rechenzeit mit WinMerge hätte ich die Restzeit sogar noch länger als das bewertet und ich hatte keine Fortschrittsanzeige.

Bei 1TB ist es mir wichitg, dass der das ordentlich macht, weil es geht schnell um 10 Stunden mehr oder weniger. 7Zip ist jetzt in 90 Minuten voraussichtlich fertig. Einen Hash hat er schon. Selbst wenn das System jetzt abstürzt, bleibt der. Bei einem Absturz hätte ich bei WinMerge gar nichts gehabt.
 
PowerShell:
Get-FileHash -Path $file1

Für jede Datei und manuell vergleichen.

Wieso die ganzen komplizierten Lösungen hier?
 
JumpingCat schrieb:
Wieso die ganzen komplizierten Lösungen hier?
7Zip finde ich einfacher, weil man den Pfad nicht kopieren muss und bei einem 1TB großen Image den Status sehen kann.
Deine Lösung finde ich wichtig, wenn ich ein Backup mit Robocopy mache und das (vielleicht bei etwas, was etwas kleiner ist) manuell mache. Ich könnte das Ergebnis dann in eine Textdatei pipen. Die Tatsache, dass es vom OS integriert ist, finde ich auch am besten.
Aber den Dateipfad zu kopieren ist schon ein signifikanter Anteil vom Aufwand. Bringt mich nicht um, aber ist halt Aufwand. Oder ich muss mal schauen, wie ich so ein Skript ins Kontextmenü kriege und den Dateipfad als Parameter übergebe (dann muss das mit dem Fortschritt für 1TB Dateien aber immer noch klappen).
 
Möglicherweise übersehe ich hier irgendwas, aber was spricht dagegen, das ganze einfach mit Windows Bordmitteln zu machen?
Commandline öffnen, Befehl certutil -hashfile '.\MeinImage.tib' SHA256 eintippen und warten bis das durch ist.
Damit das was schneller geht, den gleichen Befehl in separater Commandline für das zweite Image angeben, zurücklehnen und einen Film gucken, was Spielen, whatever.
Alternativ die Commands auf einem RasPi oder anderem Mini-PC laufen lassen (unter Linux:
sha256sum MeinImage.img > checksum ) und dann und wann mal sehen, obs durch ist.
 
@DMsRising Windows-Bordmittel ja schon genannt (sowohl Powershell Cmdlet als auch certutil).

DMsRising schrieb:
Damit das was schneller geht, den gleichen Befehl in separater Commandline für das zweite Image angeben
kontraproduktiv, weil die Dateien vom TE auf der selben HDD liegen.
 
@DMsRising : Auf alle Fälle ist es gut das zu kennen. Etwas nervig wäre das Abtippen der Pfade, wenn man das nicht scripted.
Das Problem ist aber die fehlende Statusanzeige. Das potenziert sich dann noch, wenn man in zu hoher Frequenz zweimal auf die gleiche HDD zugreift. Dann wartet man 10 Stunden und weiß noch immer nicht, wie weit man eigentlich ist.
7Zip hat für den Hash 90 Minuten pro 1TB Image benötigt, mir den Progress angezeigt und das Ergebnis in eine Datei gespeichert.
WinMerge hat nach 10 Stunden einfach nur angezeigt, dass es bei Datei 1 von 1 ist. Das etwas passiert sieht man da nur über den Taskmanager und der sagt einem nicht, ob es noch weitere 10 Stunden dauert oder gleich fertig ist.
Falls ich etwas mit Robocopy automatisiere, muss ich certutil und Get-Filehash mal gegenüberstellen.

Bisher ist 7Zip die beste Lösung.

Besser wäre es noch, wenn es die Datei in 1-10GB Intervallen lesen könnte, um abzubrechen, wenn früher Unterschiede gefunden werden, das könnte den Prozess im Extremfall dann nach den ersten 2-20GB abbrechen und man spart sich das Vergleichen der restlichen 2TB. So ein Tool habe ich aber noch nicht gefunden.
 
Zuletzt bearbeitet:
INe5xIlium schrieb:
Besser wäre es noch, wenn es die Datei in 1-10GB Intervallen lesen könnte, um abzubrechen,

Das passiert bei rsync. Aktuell sind wir noch bei Hash generierten.

btw haben die Backup Dateien keine interne Checksumme die man selbst ausliest? Dürfte sehr schnell laufen.
 
JumpingCat schrieb:
btw haben die Backup Dateien keine interne Checksumme die man selbst ausliest? Dürfte sehr schnell laufen.
😅 Zugegeben, es geht hauptsächlich darum, ob beim Kopieren etwas schief gegangen ist, wenn der Vorgang fehlgeschlagen ist, das Betriebssystem abgestürzt ist oder ich einer alten Festplatte nicht mehr ganz traue.
Der interne Hash wäre dann nicht aktuell.
Wenn man nur Duplikate entfernen will, wäre das natürlich die bessere Lösung.
 
Hier ist ein Beispiel wie man das mit "dd" erreichen kann. Es werden nacheinander 100MB Blöcke gelesen und miteinander verglichen. Unter Windows kann man z.B. die git bash dafür verwenden. Das Script hat zudem den Vorteil, dass es nicht die Standby-List spammt wie z.B. 7-zip.
Bash:
#!/bin/bash

FILE1=$1
FILE2=$2
FILESIZE1=$(stat -c%s $FILE1)
FILESIZE2=$(stat -c%s $FILE2)
if [[ $FILESIZE1 -ne $FILESIZE2 ]]; then
  echo "Files don't have the same size!"
  exit 1
fi
echo "Comparing $FILE1 with $FILE2 (Size=$FILESIZE1)"
BLOCKSIZE=$((100 * 1024 * 1024))
BLOCKS=$((FILESIZE1 / BLOCKSIZE))
INT_BLOCKS=$((BLOCKS * BLOCKSIZE))
if [[ $INT_BLOCKS -eq $FILESIZE1 ]]; then
  ((BLOCKS--))
fi
for i in $(seq 0 $BLOCKS); do
  echo -ne "$i/$BLOCKS\r"
  cs1=$(eval dd if=$FILE1 iflag=direct skip=$i bs=$BLOCKSIZE count=1 status=none| md5sum)
  cs2=$(eval dd if=$FILE2 iflag=direct skip=$i bs=$BLOCKSIZE count=1 status=none| md5sum)
  if [[ $cs1 != $cs2 ]]; then
    echo "Files are not equal! Difference in block $i"
    exit 2
  fi
done
echo "OK                          "
 
INe5xIlium schrieb:
Hallo,
ich habe 2 AOMEI Image Dateien von jeweils 1TB und möchte gerne wissen, ob die identisch sind.

Früher hatte ich mal eine Browser Extension, die mir Checksummen berechnet hat. Wenn es einen halben Tag dauert, ist eine Browser Extension nicht optimal, finde ich.

Aus Deiner Beschreibung des Geschwindigkeitsverlust auf 40 MB/s schließe ich, dass es sich um eine HDD und keine SSD handelt.

Bei einer Dateigröße von 1 TB und einer Geschwindigkeit von 40 MB/s dauert das Lesen der Datei knapp 7 Stunden. Wenn die beiden Dateien auf einer Festplatte liegen, empfiehlt sich der Vergleich anhand von Hashs anstelle eines Direktvergleichs.

Für den zeitlichen Aufwand bei der Berechnung ist es vollkommen egal, ob einer Browser-Erweiterung oder ein isoliertes Programm den Vergleich durchführt.

Wenn Du 1 TB durch die Dauertransferrate Deiner Festplatte dividierst, erhältst Du die minimal mögliche Vergleichszeit in Sekunden - schneller geht es nicht.

Bei der ersten Anzeige der Vergleichsgeschwindigkeit von 40 MB/s hättest Du Deine Geschwindigkeit mehr als verdoppeln können, in dem Du die zweite Datei auf eine weitere, möglichst unfragmentierte Festplatte kopiert hättest.

Jetzt nach 12 Stunden ist nicht klar, ob die Dateien stark fragmentiert sind oder ob Dein Vergleichsprogramm vielleicht an einem unlesbaren Sektor hängengeblieben ist.

INe5xIlium schrieb:
Ich würde aber gerne wissen, ob die Images noch identisch sind. Welches Programm würdet ihr dafür emfpehlen? Die KI empfiehlt BeyondCompare, aber ist das wirklich anders als WinMerge?

Jedes Hashprogramm mit Fortschrittanzeige erfüllt Deine Anforderungen. Ich finde HashTab gut, OpenHashTab wird wahrscheinlich genauso gut sein.
 
Zurück
Oben