Prawie jak mogę powiedzieć, opcja zip -T określa tylko, czy pliki można wyodrębnić - tak naprawdę nie testuje archiwum pod kątem wewnętrznej integralności. Na przykład celowo zepsułem lokalny (nie centralny katalog) CRC dla pliku, a zip nie dbał wcale, zgłaszając archiwum jako OK. Czy można to zrobić w inny sposób?
W plikach ZIP jest dużo wewnętrznej nadmiarowości i dobrze byłoby mieć sposób na sprawdzenie tego wszystkiego. Oczywiście, zwykle potrzebujesz centralnego katalogu, ale przy naprawie uszkodzonego archiwum często wszystko, co masz, to fragment, z zablokowanym lub brakującym centralnym katalogiem. Chciałbym wiedzieć, czy archiwa, które tworzę, są tak łatwe do odzyskania, jak to możliwe.
unzip -t
?Odpowiedzi:
[źródło: https://linux.die.net/man/1/unzip ]
źródło
unzip -t
testuje tylko to drugie.Próba naprawienia archiwum spowoduje porównanie lokalnych i centralnych CRC, a połączenie tego z testami archiwalnymi pozwoli na sprawdzenie wszystkich CRC. Jeśli uciekniesz
i
i nie narzekają, co oznacza, że zawartość archiwum pasuje zarówno do centralnej, jak i lokalnej CRC. (Możesz
archivefix.zip
później usunąć .)Aby to sprawdzić, zaczynając od kodu źródłowego Info-ZIP dla
zip
3.0, utworzyłem plik w następujący sposób:Następnie uszkodziłem CRC katalogu centralnego,
zip.txt
zmieniając bajt z przesunięciem 0xB137. Mam zachowanie przeciwne do tego, co zaobserwowałeś;unzip -v
Podawane zmienionego CRC z katalogu centralnego, aleunzip -t
izip -T
poinformował, że plik był OK (sprawdzanie przeciwko miejscowym CRC).Ale działa
zgłoszone
W „poprawionym” pliku nadal znajduje się zmieniony CRC
zip.txt
.Zmiana lokalnego CRC
zip.txt
na przesunięcie 0x10 spowodowała obaunzip -t
izip -T
zgłosiła błąd CRC, alezip -F
nie zauważyła nic złego.Zatem z moich eksperymentów rozbieżności między zawartością wpisu archiwum a jego CRC można wykryć w następujący sposób:
zip -T
iunzip -t
;zip -F
będzie również narzekać na niedopasowanie centralne na szczeblu lokalnymzip -T
iunzip -t
zip -T
iunzip -t
nie będzie narzekać, alezip -F
wskaże niedopasowanie lokalne i centralne(Zauważ, że domyślnie
zip -T
po prostu wykorzystujeunzip -tqq
, takzip -T
iunzip -t
naprawdę są równoważne można odczytać.unzip
Kod źródłowy, aby sprawdzić, testując archiwum naprawdę porównuje lokalny CRC, a nie jeden centralny; wyglądextract_or_test_files()
,extract_or_test_entrylist()
aextract_or_test_member()
wszystko wextract.c
.)źródło
zip
iunzip
dostępnych na platformach typu Unix; Info-ZIP jest używany prawie wszędzie ...unzip -t
izip -F
uruchomić bez błędu, jesteś OK i oba CRC zostały sprawdzone.