Ich habe zwei Dateien mit den Größen 124665 und 124858 in Bytes und möchte überprüfen, ob file1 ein Präfix von file2 ist oder nicht.
files
file-comparison
tvorog
quelle
quelle
cmp
das besser wäre alsdiff
hier?cmp
führt einen einfachen Byte-zu-Byte-Vergleich durch und gibt zurück, sobald ein Unterschied festgestellt wird, währenddiff
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 hatdiffutils
, ist eine Optionhöchstens die ersten 124665 Bytes der beiden Dateien zu vergleichen und zu melden, ob sie sich unterscheiden - oder allgemeiner
quelle
$(stat -c %s file1)
die Größe in Bytes vorzuschlagen ? Wirdwc
die gesamte Datei tatsächlich geöffnet und verarbeitet, um die Byteanzahl zu ermitteln?wc
Implementierungen optimieren diesen Fall und führen afstat()
(oder / und alseek(SEEK_END)
) aus, um so effizient wie möglich zu sein. Andererseitsstat -c
ist das GNU-spezifisch.cmp
, können Sie davon ausgehen, dass GNU-spezifisch iststat
.GNU
cmp
kann das Problem auf einfachere Weise lösen: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 diefile1 file2 differ
Nachricht an stdout geht.Ich vermute, dass andere Versionen
cmp
etwas ähnliches tun, aber ich habe nicht überprüft.quelle
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 GNUcmp
die einzige Version ist, die ich ausprobiert habe. Ich habe einen Satz hinzugefügt, um dies zu verdeutlichen.file1
und die andere benannt istfile12
. (Oder schlimmer noch, was ist, wenn die zweite Datei benannt istEOF on file1
?) Solches robustes Verwendencmp
ist wahrscheinlich viel schwieriger als das Schreiben des offensichtlichen 5-Zeilen-Programms in C ...cmp
so stark eingeschränkt ist. Wenn Sie die-x
Optiongrep
zum Anpassen der gesamten Zeile aktivieren, werden alle bis auf die exotischsten Fälle (z. B. Zeilenumbrüche im Dateinamen) berücksichtigt.