Antworten:
Angenommen, Sie haben die Größe von file1
in der Variablen FILE1_SZ
und Ihre head
Implementierung unterstützt die (nicht standardmäßige) -c
Option:
if head -c "$FILE1_SZ" file2 | cmp -s - file1; then
echo "file1 is a prefix of file2"
else
echo "file1 is not a prefix of file2"
fi
cmp
führt einen einfachen Byte-zu-Byte-Vergleich durch und gibt zurück, sobald ein Unterschied festgestellt wird, während diff
ein Textdienstprogramm einen komplexen Algorithmus verwendet, um alle Unterschiede zwischen den beiden Dateien anzuzeigen, die Sie nicht interessieren.
Wenn Ihr System den cmp
Befehl von GNU hat diffutils
, ist eine Option
cmp -n 124665 file1 file2
höchstens die ersten 124665 Bytes der beiden Dateien zu vergleichen und zu melden, ob sie sich unterscheiden - oder allgemeiner
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)
die Größe in Bytes vorzuschlagen ? Wird wc
die gesamte Datei tatsächlich geöffnet und verarbeitet, um die Byteanzahl zu ermitteln?
wc
Implementierungen optimieren diesen Fall und führen a fstat()
(oder / und a lseek(SEEK_END)
) aus, um so effizient wie möglich zu sein. Andererseits stat -c
ist das GNU-spezifisch.
cmp
, können Sie davon ausgehen, dass GNU-spezifisch ist stat
.
GNU cmp
kann das Problem auf einfachere Weise lösen:
cmp file1 file2
Es gibt vier mögliche Ausgänge (außer bei Fehlern).
Keine Ausgabe: Die Dateien sind identisch.
cmp: EOF on file1
: file1 ist ein Präfix von file2.
cmp: EOF on file2
: file2 ist ein Präfix von file1.
file1 file2 differ: byte NNN, line MMM
: Keiner ist ein Präfix des anderen.
Leider ist die Verwendung in einem Skript etwas umständlich, da diese Fälle im Exit-Code nicht zu unterscheiden scheinen. Darüber hinaus EOF on file1
gehen die Nachrichten an stderr, während die file1 file2 differ
Nachricht an stdout geht.
Ich vermute, dass andere Versionen cmp
etwas ähnliches tun, aber ich habe nicht überprüft.
cmp
ist kein reiner GNU-Befehl und stammt auch nicht von dort. Es war bereits in der ersten Unix-Version in den frühen 70ern. Die -n
Option ist jedoch GNU-spezifisch.
cmp file1 file2 2>&1 | grep EOF on file1
cmp
nur für GNU gilt, sondern nur, dass GNU cmp
die einzige Version ist, die ich ausprobiert habe. Ich habe einen Satz hinzugefügt, um dies zu verdeutlichen.
file1
und die andere benannt ist file12
. (Oder schlimmer noch, was ist, wenn die zweite Datei benannt ist EOF on file1
?) Solches robustes Verwenden cmp
ist wahrscheinlich viel schwieriger als das Schreiben des offensichtlichen 5-Zeilen-Programms in C ...
cmp
so stark eingeschränkt ist. Wenn Sie die -x
Option grep
zum Anpassen der gesamten Zeile aktivieren, werden alle bis auf die exotischsten Fälle (z. B. Zeilenumbrüche im Dateinamen) berücksichtigt.
cmp
das besser wäre alsdiff
hier?