Mam dwa pliki o rozmiarach 124665 i 124858 w bajtach i chcę sprawdzić, czy plik1 jest prefiksem pliku2, czy nie.
files
file-comparison
tvorog
źródło
źródło
cmp
byłoby lepiej niżdiff
tutaj?cmp
wykonuje proste porównanie bajt-bajt i zwraca, gdy tylko zauważy różnicę, a jednocześniediff
jest narzędziem tekstowym, które korzysta ze złożonego algorytmu, aby pokazać wszystkie różnice między dwoma plikami, na których ci nie zależy.Jeśli twój system ma
cmp
polecenie z GNUdiffutils
, to jedną z opcji jestporównać najwyżej pierwsze 124665 bajtów dwóch plików i zgłosić, jeśli się różnią - lub bardziej ogólnie
źródło
$(stat -c %s file1)
rozmiar w bajtach? Czywc
faktycznie otwiera i przetwarza cały plik, aby uzyskać liczbę bajtów?wc
implementacji zoptymalizuje tę sprawę i zrobifstat()
(lub / i alseek(SEEK_END)
), więc będzie tak wydajna, jak to możliwe. Z drugiej stronystat -c
jest to specyficzne dla GNU.cmp
, możesz rozsądnie założyć, że są specyficzne dla GNUstat
.GNU
cmp
może rozwiązać problem w łatwiejszy sposób:Istnieją cztery możliwe wyniki (z wyjątkiem jakiegoś błędu).
Brak danych wyjściowych: pliki są identyczne.
cmp: EOF on file1
: plik1 jest prefiksem pliku2.cmp: EOF on file2
: plik2 jest prefiksem pliku1.file1 file2 differ: byte NNN, line MMM
: Żaden nie jest przedrostkiem drugiego.Niestety jest to trochę niewygodne w użyciu w skrypcie, ponieważ te przypadki nie wydają się być rozróżniane w kodzie wyjścia. Ponadto
EOF on file1
wiadomości trafiają do stderr, podczas gdyfile1 file2 differ
wiadomość trafia do stdout.Zakładam, że inne wersje
cmp
robią coś podobnego, ale nie sprawdziłem.źródło
cmp
nie jest poleceniem opartym tylko na GNU, ani się tam nie wywodzi, był już w pierwszej wersji Uniksa na początku lat 70. Ta-n
opcja jest jednak specyficzna dla GNU.cmp file1 file2 2>&1 | grep EOF on file1
cmp
było to unikalne dla GNU, tylko że GNUcmp
była jedyną wersją, której próbowałem. Dodałem zdanie w celu wyjaśnienia.file1
a drugi nazwęfile12
. (Lub jeszcze gorzej, co jeśli drugi plik zostanie nazwanyEOF on file1
?) Solidne rozwiązanie tego problemucmp
jest prawdopodobnie znacznie większym problemem niż napisanie oczywistego 5-liniowego programu w C ...cmp
jest tak ściśle ograniczona. Użycie-x
opcji włącz,grep
aby dopasować całą linię, zajmie się wszystkimi przypadkami oprócz najbardziej egzotycznych (np. Znaki nowej linii w nazwie pliku).