Antworten:
Angenommen, Sie haben die Größe von file1in der Variablen FILE1_SZund Ihre headImplementierung unterstützt die (nicht standardmäßige) -cOption:
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
cmpführt einen einfachen Byte-zu-Byte-Vergleich durch und gibt zurück, sobald ein Unterschied festgestellt wird, während diffein Textdienstprogramm einen komplexen Algorithmus verwendet, um alle Unterschiede zwischen den beiden Dateien anzuzeigen, die Sie nicht interessieren.
Wenn Ihr System den cmpBefehl 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 wcdie gesamte Datei tatsächlich geöffnet und verarbeitet, um die Byteanzahl zu ermitteln?
wcImplementierungen 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 -cist das GNU-spezifisch.
cmp, können Sie davon ausgehen, dass GNU-spezifisch ist stat.
GNU cmpkann 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 file1gehen die Nachrichten an stderr, während die file1 file2 differNachricht an stdout geht.
Ich vermute, dass andere Versionen cmpetwas ähnliches tun, aber ich habe nicht überprüft.
cmpist kein reiner GNU-Befehl und stammt auch nicht von dort. Es war bereits in der ersten Unix-Version in den frühen 70ern. Die -nOption ist jedoch GNU-spezifisch.
cmp file1 file2 2>&1 | grep EOF on file1
cmpnur für GNU gilt, sondern nur, dass GNU cmpdie einzige Version ist, die ich ausprobiert habe. Ich habe einen Satz hinzugefügt, um dies zu verdeutlichen.
file1und die andere benannt ist file12. (Oder schlimmer noch, was ist, wenn die zweite Datei benannt ist EOF on file1?) Solches robustes Verwenden cmpist wahrscheinlich viel schwieriger als das Schreiben des offensichtlichen 5-Zeilen-Programms in C ...
cmpso stark eingeschränkt ist. Wenn Sie die -xOption grepzum Anpassen der gesamten Zeile aktivieren, werden alle bis auf die exotischsten Fälle (z. B. Zeilenumbrüche im Dateinamen) berücksichtigt.
cmpdas besser wäre alsdiffhier?