Come posso testare tutti i file zip in una cartella per verificare se sono danneggiati o no?


23

Molto tempo fa c'era un'utilità chiamata CFAtest che lo faceva abbastanza bene, ma è scomparsa.

Fondamentalmente, sto cercando uno strumento simile (preferibilmente grafico) che attraversi un determinato percorso (preferibilmente includendo le sottocartelle) e testerà tutti i file zip che trova.

Le opzioni di registrazione decenti sarebbero un vantaggio.


4
Quale sistema operativo?
Matteo,

Qualsiasi packer recente può effettuare controlli di integrità dell'archivio.
Overmind

Risposte:


17

Trova tutti i file zip in ogni sottocartella

Questo troverà in tutte le sottocartelle della cartella corrente ( .) i file ( -type f) con l'estensione zip(o ZIPo Zipo zIpe così via, il caso viene ignorato, -iname) e testare la loro integrità (opzionale -t) essere tranquillo (opzione -q, insieme -tq). Essere abbastanza significa: non elencare il contenuto del file zip, ma riportare solo i risultati del test.

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

Solo la cartella corrente (nessuna sottocartella)

Se vuoi solo controllare i file nella directory corrente e non in nessuna sottocartella, usa

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

nella directory con i file zip. Questo controlla anche per le estensioni dei file ZIPo Zipo zIpe così via, caso viene ignorato.


1
E se sei su Windows e non hai find, installa Cygwin.
Daniel R Hicks,

2
... o usa il forcomando.
Karan,


2
Se ci sono molti file ZIP o se contengono molti file, si potrebbe desiderare un output meno dettagliato. Usa l'opzione -q di unzip per questo: unzip -tq
malamut

1
O installa git per Windows (potresti averlo già se sei uno sviluppatore) che viene fornito con una bash e molti altri utili strumenti di gnu cli.
wp78de,

15

Su Windows utilizzo 7zip : fornisce un'interfaccia utente grafica, è gratuito e supporta un'ampia gamma di formati di file di archivio, incluso zip.

Passare alla cartella specificata che si desidera analizzare in Esplora risorse. Cerca *.zip, seleziona tutti i file, fai clic con il tasto destro, seleziona "Test Archive"

inserisci qui la descrizione dell'immagine

Quindi attendere (notare che sono necessari circa 10 minuti affinché explorer.exe passi attraverso 100.000 .zip prima che 7z inizi il test):

inserisci qui la descrizione dell'immagine


8

La risposta di erik non ha funzionato per me su un Mac ma questo funziona con le zip nella cartella corrente e in tutte le sottocartelle:

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

Emette questo per ogni file:

No errors detected in compressed data of ./2013-10-16.zip.

2

Comando Quick PowerShell - usando l' interruttore "t" della riga di comando di 7zip

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

Produzione

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


0

Di seguito è riportato uno script in Python per testare file zip situati in una o più cartelle. L'ho provato su Windows 7 SP1 x64 Ultimate ma mi aspetto che funzioni su qualsiasi sistema operativo.

Esempio di output:

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

script:

'''
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

Scrive anche un file di registro contenente tutti i file zip validi e un file di registro contenente tutti i file zip danneggiati.

Indice di velocità contro 7zip: 577,64 secondi Python contro 609 secondi 7zip

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.