Mam jeden pomyślnie pobrany plik, a drugi nieudany (tylko pierwsze 100 MB dużego pliku), który, jak podejrzewam, jest tym samym plikiem.
Aby to zweryfikować, chciałbym sprawdzić ich skróty, ale ponieważ mam tylko część nieudanego pliku, chcę hashować tylko kilka pierwszych megabajtów.
Jak mam to zrobic?
System operacyjny to Windows, ale mam zainstalowane cygwin i MinGW.
Odpowiedzi:
Tworzenie skrótów do porównania plików sens jeśli porównać jeden plik przeciw wielu, albo przy porównywaniu wielu plików przed sobą.
Nie ma sensu porównywanie dwóch plików tylko raz: wysiłek obliczenia skrótów jest co najmniej tak wysoki, jak przejście po plikach i porównanie ich bezpośrednio.
Skuteczne narzędzie do porównywania plików to
cmp
:Możesz go również połączyć z,
dd
aby porównać dowolne części (niekoniecznie od początku) dwóch plików, np .:źródło
cmp
ma 99,99% pewności, że jest już zainstalowany, jeśli maszbash
uruchomiony, i wykonuje to zadanie. Rzeczywiście,cmp -n 131072 one.zip two.zip
zrobi to samo. Najmniej znaków do wpisania i najszybsze wykonanie. Obliczanie wartości skrótu jest bezsensowne. Wymaga odczytania całego pliku 100 MB, a także 100 MB części całego pliku, co jest bezcelowe. Jeśli są to pliki zip i różnią się między sobą, w pierwszych kilkuset bajtach będzie różnica. Readahead domyślnie dostarcza 128k, więc możesz także porównać 128k (taki sam koszt jak porównanie 1 bajtu).--bytes
opcja tylko komplikuje zadanie. Po prostu uruchomcmp
bez tej opcji, a wyświetli się pierwszy bajt różniący się między plikami. Jeśli wszystkie bajty są takie same, pojawiEOF
się w krótszym pliku. To da ci więcej informacji niż twój przykład - ile bajtów jest poprawnych.cmp
(i myślę, że prawie każdy ma), można użyć--ignore-initial
i--bytes
argumenty zamiast komplikowania rzeczy z wywołaniamidd
.Przepraszam, że nie mogę tego dokładnie wypróbować, ale ten sposób zadziała
Otrzymasz pierwsze 100 megabajtów obu plików.
Teraz zdobądź skróty:
Możesz także uruchomić go bezpośrednio:
źródło
cmp
).cmp
) jest bez wątpienia zwycięzcą. Ale ten sposób rozwiązania problemu (użycie skrótów) ma również prawo istnieć tak długo, jak faktycznie rozwiązuje problem (:Wydaje się, że wszyscy podążają tą drogą Unix / Linux, ale wystarczy porównać 2 pliki za pomocą standardowych poleceń systemu Windows:
FC /B file file2
FC jest obecny we wszystkich wersjach systemu Windows NT. I (jeśli dobrze pamiętam) był również obecny w DOS.
Jest to trochę powolne, ale nie ma to znaczenia przy jednorazowym użyciu.
źródło
Możesz po prostu bezpośrednio porównać pliki za pomocą programu diff binarnego / szesnastkowego
vbindiff
. Szybko porównuje pliki do 4 GB w systemach Linux i Windows.Wygląda mniej więcej tak, tylko z różnicą podświetloną na czerwono (1B vs 1C):
źródło
vbindiff
(i Konradacmp
) porównuje dane binarne, bajt po bajcie. W rzeczywistości wartości są znacznie bardziej narażone na zderzeniaWiem, że to mówi o Bash, ale OP stwierdza również, że mają Windows. Dla każdego, kto chce / wymaga rozwiązania Windows, jest program o nazwie HxD, który jest edytorem szesnastkowym, który może porównywać dwa pliki. Jeśli pliki mają różne rozmiary, pokaże, czy dostępne części są takie same. W razie potrzeby może uruchamiać sumy kontrolne dla tego, co jest obecnie wybrane. Jest bezpłatny i można go pobrać ze strony: HxD . Nie mam żadnego związku z autorem (autorami), używam go od lat.
źródło
cmp powie ci, kiedy dwa pliki są identyczne do długości mniejszego pliku:
cmp mówi ci, że porównanie napotkało EOF w pliku a, zanim wykryło różnicę między tymi dwoma plikami.
źródło