¿Cómo puedo probar todos los archivos zip en una carpeta para verificar si están dañados o no?

23

Hubo una utilidad hace mucho tiempo llamada CFAtest que estaba haciendo esto bastante bien, pero ha desaparecido.

Básicamente, estoy buscando una herramienta similar (preferiblemente gráfica) que recorra una ruta dada (preferiblemente incluyendo subcarpetas) y pruebe todos los archivos zip que encuentre.

Las opciones de registro decentes serían una ventaja.

isarris
fuente
44
Cual sistema operativo
Matteo
Cualquier empacador reciente puede hacer comprobaciones de integridad de archivo.
Overmind

Respuestas:

17

Encuentra cada archivo zip en cada subcarpeta

Esto encontrará en todas las subcarpetas de la carpeta actual ( .) los archivos ( -type f) con la extensión zip(o ZIPo Zipo zIpy así sucesivamente, el caso se ignora -iname) y probará su integridad (opción -t) en silencio (opción -q, juntos -tq). Ser bastante significa: no enumerar el contenido del archivo zip, sino solo informar el resultado de la prueba.

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

Solo carpeta actual (sin subcarpetas)

Si solo desea verificar los archivos en el directorio actual, y no en ninguna subcarpeta, use

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

en el directorio con los archivos zip. Esto también comprueba las extensiones de archivo ZIPo Zipo zIpetc., se ignora el caso.

erik
fuente
1
Y si está en Windows y no tiene find, instale Cygwin.
Daniel R Hicks el
2
... o usa el forcomando.
Karan
... o descargue gnuwin32.sourceforge.net
Franck Dernoncourt
2
Si hay muchos archivos ZIP, o si contienen muchos archivos, se puede desear una salida menos detallada. Use la opción -q de descomprimir para eso: descomprimir -tq
malamut
1
O instale git para Windows (puede que ya lo tenga si es un desarrollador) que viene con bash y muchas otras herramientas útiles de gnu cli.
wp78de
15

En Windows utilizo 7zip : proporciona una interfaz gráfica de usuario, es gratuito y admite una amplia gama de formatos de archivo, incluido zip.

Navegue a la carpeta dada que desea analizar en el Explorador de Windows. Busque *.zip, seleccione todos los archivos, haga clic derecho, seleccione "Archivo de prueba"

ingrese la descripción de la imagen aquí

Luego, espere (tenga en cuenta que explorer.exe tarda alrededor de 10 minutos en pasar por 100,000 .zip antes de que 7z comience a probar):

ingrese la descripción de la imagen aquí

Franck Dernoncourt
fuente
8

La respuesta de Erik no funcionó para mí en una Mac, pero esto funciona para las cremalleras en la carpeta actual y todas las subcarpetas:

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

Emite esto para cada archivo:

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

Comando rápido de PowerShell: uso del interruptor de línea de comando "t" de 7zip

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

Salida

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
fuente
0

Aquí está debajo de un script en Python para probar archivos zip ubicados en una o varias carpetas. Lo probé en Windows 7 SP1 x64 Ultimate pero esperaría que funcionara en cualquier sistema operativo.

Ejemplo de salida:

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

Guión:

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

También escribe un archivo de registro que contiene todos los archivos zip válidos, así como un archivo de registro que contiene todos los archivos zip dañados.

Punto de referencia de velocidad contra 7zip: 577,64 segundos Python frente a 609 segundos 7zip

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Franck Dernoncourt
fuente