Bash Testen, ob zwei Files genau gleich sind, in POSIX-Shell

kali-hi

Banned
Registriert
Sep. 2025
Beiträge
760
Gibt es einen einfacheren/schnelleren Weg, um zwei Binärdateien inhaltlich zu vergleichen? Es sollte POSIX-konform bleiben

Bash:
#!/bin/sh
set -e
mysum1=$(sha256sum file1)
mysum1_short=$(echo "${mysum1}" | cut -c1-32)
mysum2=$(sha256sum file2)
mysum2_short=$(echo "${mysum2}" | cut -c1-32)
if [ "$mysum1_short" = "$mysum2_short" ]; then
    echo "Warning: The files are identical!"
    sleep 10
fi

cmp -s ... funktioniert leider nicht...
 
Was funktioniert an cmp nicht?

Was man zusätzlich noch machen könnte wäre zuerst auf die Datei Größe schauen. Dateien die nicht die gleiche Größe haben können nicht gleich sein.

Ansonsten müsste cmp effizienter sein, als shasum da shasum die gesamte datei lesen muss, aber cmp bricht ab, beim ersten Unterschied

es gibt ansonsten mit fdupes, fclones u.a. dedizierte tools dafür
 
  • Gefällt mir
Reaktionen: Piktogramm, GTrash81, SaschaHa und eine weitere Person
chatgpt sagt:
if cmp -s file1.bin file2.bin; then
echo "identical"
else
echo "different"
fi
 
  • Gefällt mir
Reaktionen: kali-hi
Bash:
#!/bin/sh

if [ "$#" -ne 2 ]; then
  echo "Usage: $0 file1 file2" >&2
  exit 2
fi

if cmp -s "$1" "$2"; then
  echo "true"
  exit 0
else
  echo "false"
  exit 1
fi

so wird es aufgerufen:

Code:
./compare.sh file1 file2

Als Ergebnis gibt es ein true oder false, je nachdem ob die Dateien gleich sind oder nicht. (Läuft so unter Ubuntu 24.04)
 
@kali-hi
Das ist bestimmt nur ein Syntaxfehler. Beispielsweise klappt das hier bei mir:
Bash:
#!/bin/bash

if [ $(cmp -s test1.txt test2.txt) ]; then
    echo "Die Dateien sind gleich."
else
    echo "Die Dateien sind nicht gleich."
fi
 
  • Gefällt mir
Reaktionen: Piktogramm
diff geht auch
 
  • Gefällt mir
Reaktionen: Piktogramm, und tschüss und Termy
a170bi schrieb:
if cmp -s file1.bin file2.bin; then
ja gut, ich bin nicht darauf gekommen, alles aus der Bedingung zu entfernen... ich teste das mal gerade.
Ergänzung ()

Bash:
#!/bin/sh
if cmp -s file1 file2; then echo "identical"; else echo "different"; fi

funktioniert ...

Aber das Problem ist noch etwas komplexer. Von file1 habe ich zwecks Logging schon die sha256sum berechnet (diese wird zur Sicherheit samt Dateinamen und Zeitstempel in eine Datei geschrieben). Was wäre dann insgesamt gesehen schneller?

a) Von file2 die sha256sum auch berechnen und vergleichen?
b) Oder cmp -s für beide Files aufrufen und vergleichen?

Es geht um ca. 1 GB file size.
 
Zuletzt bearbeitet:
cmp hat nur vorteile, wenn sich die dateien unterscheiden - abbruch beim ersten unterschied

sonst wenn du die shasum hast, auch shasum nehmen. dann muss die erste datei nicht noch einmal, gelesen werden
 
  • Gefällt mir
Reaktionen: Alter_Falter und kali-hi
a170bi schrieb:
muss sha256sum nicht auch die ganze Datei lesen?
schon, aber hier geht es um 2x sha256sum vs. 1x sha256sum + 1x cmp ..., wobei in 50 % der Fälle die Dateien identisch sind, und ein Overhead aufgrund der relativen großen file sizes vernachlässigbar ist.
 
a170bi schrieb:
diff ist aber nicht Posix conform
Jein
Teile sind es nicht, je nachdem welche flags genutzt werden
Wenn POSIXLY_CORRECT gesetzt ist, ist auch diff output posix konform
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: kali-hi
In der Praxis wird die erste Datei wahrscheinlich noch im block cache sein? Dann wird cmp im Schnitt wohl schneller sein.
 
Vergleicht cmp vorweg auch die Dateigrößen - oder muss man das selbst machen?
 
Doch. Wenn cmp keine Ausgabe geben muss, wo die Dateien sich unterscheiden, prüft es auf Dateigröße und liest die Dateien nicht ein. Also einfach --silent nutzen.
 
  • Gefällt mir
Reaktionen: kali-hi und madmax2010
Alles klar, dann mache ich noch ein paar Zeitmessungen, also Benchmarks
 
Zurück
Oben