Jak mogę przetestować wszystkie pliki zip w folderze, aby sprawdzić, czy są uszkodzone, czy nie?

23

Dawno temu istniało narzędzie o nazwie CFAtest, które robiło to całkiem nieźle, ale zniknęło.

Zasadniczo szukam podobnego narzędzia (najlepiej graficznego), które przemierza daną ścieżkę (najlepiej włączając podfoldery) i testuje wszystkie znalezione pliki zip.

Przyzwoite opcje rejestrowania byłyby plusem.

isarris
źródło
4
Który system operacyjny?
Matteo,
Każdy ostatni program pakujący może sprawdzać integralność archiwum.
Overmind,

Odpowiedzi:

17

Znajdź każdy plik zip w każdym podfolderze

Pozwoli to znaleźć we wszystkich podfolderów w bieżącym folderze ( .) (pliki -type f) z rozszerzeniem zip(lub ZIPlub Ziplub zIpi tak dalej, sprawa jest ignorowany -iname) i przetestować ich integralności (opcja -t) being quiet (opcja -q, razem-tq ). Bycie całkiem oznacza: nie wyświetlać zawartości pliku zip, a jedynie raportować wynik testu.

find . -type f -iname '*.zip' -exec unzip -tq {} \;

Tylko bieżący folder (bez podfolderów)

Jeśli chcesz tylko sprawdzić pliki w bieżącym katalogu, a nie w żadnych podfolderach, użyj

unzip -tq '*.[Zz][Ii][Pp]'

w katalogu z plikami zip. To także sprawdza rozszerzeń plików ZIPlub Zipczy zIpi tak dalej, sprawa jest ignorowany.

erik
źródło
1
A jeśli korzystasz z systemu Windows i nie masz find, zainstaluj Cygwin.
Daniel R Hicks
2
... lub użyj forpolecenia.
Karan
... lub pobierz gnuwin32.sourceforge.net
Franck Dernoncourt
2
Jeśli jest wiele plików ZIP lub zawierają wiele plików, może być pożądane mniej szczegółowe wyjście. Użyj do tego opcji -q programu unzip: unzip -tq
malamut
1
Lub zainstaluj git dla Windows (możesz go już mieć, jeśli jesteś programistą), który jest wyposażony w bash i wiele innych pomocnych narzędzi gnu cli.
wp78de
15

W systemie Windows używam 7zip : zapewnia graficzny interfejs użytkownika, jest bezpłatny i obsługuje szeroki zakres formatów plików archiwów, w tym zip.

Przejdź do danego folderu, który chcesz przeanalizować w Eksploratorze Windows. Wyszukaj *.zip, zaznacz wszystkie pliki, kliknij prawym przyciskiem myszy, wybierz „Testuj archiwum”

wprowadź opis zdjęcia tutaj

Następnie poczekaj (zwróć uwagę, że explorer.exe przejdzie przez 100 000 .zip przed rozpoczęciem testowania 7z):

wprowadź opis zdjęcia tutaj

Franck Dernoncourt
źródło
8

Odpowiedź Erika nie działała dla mnie na komputerze Mac, ale działa to dla zamków błyskawicznych w bieżącym folderze i wszystkich podfolderach:

find . -name '*.zip' -exec unzip -tq {} \;

Wyprowadza to dla każdego pliku:

No errors detected in compressed data of ./2013-10-16.zip.
malhal
źródło
2

Szybkie polecenie PowerShell - za pomocą przełącznika „t” wiersza polecenia 7zip

$7z = "T:\folder\to\7z.exe"
Dir "C:\folder\to\check" -r -include @("*.zip","*.7z") | % { & $7z t $_ -r}

Wydajność

7-Zip 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18

Processing archive: D:\testfile.zip

Testing     my test file.txt
Testing     second file.doc

Everything is Ok

Folders: 0
Files: 2
Size:       10353
Compressed: 5721
nixda
źródło
0

Poniżej znajduje się skrypt w Pythonie do testowania plików zip znajdujących się w jednym lub kilku folderach. Przetestowałem to na Windows 7 SP1 x64 Ultimate, ale spodziewam się, że będzie działać na każdym systemie operacyjnym.

Przykład wyniku:

Total time spent was 577.64 seconds, checking 100 files, totaling 77.06 GB, 
among which 0 were corrupted.

Scenariusz:

'''
Test if the zip files are not corrected
'''

from __future__ import print_function
from __future__ import division

import sys
import zipfile
import glob
import os
import time

def test_zipfile(filepath):
    '''
    Test whether a zipfile is valid
    Some lines were taken from http://stackoverflow.com/questions/4875747/python-script-to-check-if-a-zip-file-is-corrupt
    '''
    start_time = time.time()
    filesize = os.path.getsize(filepath)
    print('Starting testing file: {0} ({1:.2f} MB)'.format(filepath,filesize/10**6), end='')
    the_zip_file = zipfile.ZipFile(filepath)
    ret = the_zip_file.testzip()
    time_spent = time.time() - start_time
    print('\tTest ended. Time spent: {0:.2f} s'.format(time_spent))
    if ret is not None:
        print("First bad file in zip {0}: {1}".format(filepath,ret))
        is_valid = False
    else:
        #print "Zip file is good."
        is_valid = True

    return is_valid, time_spent, filesize


def main():
    '''
    This is the main function
    '''

    # Parameters
    zipfiles_root_folder = '.'
    log_filepath_corrupted = 'result_corrupted.log'
    log_file_corrupted = open(log_filepath_corrupted, 'w')
    log_filepath_valid = 'result_valid.log'
    log_file_valid = open(log_filepath_valid, 'w')
    zipfile_filepaths = sorted(glob.iglob(os.path.join(zipfiles_root_folder, '*', '*.zip'))) # Modify this to whatever folders you need

    # Testing zipfiles
    start_time = time.time()
    total_filesize = 0
    number_of_corrupted_zipfile = 0
    for zipfile_filepath in zipfile_filepaths: # generator, search immediate subdirectories 
        is_valid, test_zipfile_time_spent, filesize = test_zipfile(zipfile_filepath)
        total_filesize += filesize
        if is_valid:
            log_file_valid.write('{0}\n'.format(zipfile_filepath))
        else:
            log_file_corrupted.write('{0}\n'.format(zipfile_filepath))
            number_of_corrupted_zipfile += 1

    # Cleaning  
    log_file_corrupted.close()
    log_file_valid.close()

    time_spent = time.time() - start_time
    print('Total time spent was {0:.2f} seconds, checking {1} files, totaling {2:.2f} GB, among which {3} were corrupted.'.format(time_spent, len(zipfile_filepaths),total_filesize/10**9,number_of_corrupted_zipfile))


if __name__ == "__main__":
    main()
    #cProfile.run('main()') # if you want to do some profiling

Zapisuje również plik dziennika zawierający wszystkie prawidłowe pliki zip, a także plik dziennika zawierający wszystkie uszkodzone pliki zip.

Test prędkości w stosunku do 7zip: 577,64 sekund Python vs. 609 sekund 7zip

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Franck Dernoncourt
źródło