Como posso testar todos os arquivos zip em uma pasta para verificar se estão corrompidos ou não?

22

Há muito tempo, havia um utilitário chamado CFAtest que fazia isso muito bem, mas desapareceu.

Basicamente, estou procurando uma ferramenta semelhante (de preferência gráfica) que percorra um determinado caminho (de preferência incluindo subpastas) e teste todos os arquivos zip que encontrar.

Opções de log decentes seriam uma vantagem.

isarris
fonte
4
Qual sistema operacional?
Matteo
Qualquer empacotador recente pode fazer verificações de integridade do arquivo.
22717 Overmind

Respostas:

16

Encontre todos os arquivos zip em todas as subpastas

Isto vai encontrar em todas as subpastas da pasta atual ( .) os arquivos ( -type f) com a extensão zip(ou ZIPou Zipou zIpe assim por diante, caso seja ignorado, -iname) e testar a sua integridade (opção -t) sendo silencioso (opção -q, em conjunto -tq). Sendo bastante significativo: não liste o conteúdo do arquivo zip, mas apenas relate o resultado do teste.

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

Apenas a pasta atual (sem subpastas)

Se você quiser apenas verificar os arquivos no diretório atual, e não em nenhuma subpasta, use

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

no diretório com os arquivos zip. Ele também verifica para extensões de arquivo ZIPou Zipou zIpe assim por diante, caso seja ignorado.

erik
fonte
11
E se você estiver no Windows e não tiver find, instale o Cygwin.
Daniel R Hicks
2
... ou use o forcomando
22413 Karan
... ou faça o download de gnuwin32.sourceforge.net
Franck Dernoncourt 8/14
2
Se houver muitos arquivos ZIP ou se eles contiverem muitos arquivos, poderá ser necessária uma saída menos detalhada. Do uso de descompactação opção -q para isso: -tq unzip
malamut
11
Ou instale o git para Windows (você já o possui se for um desenvolvedor), que vem com um bash e muitas outras ferramentas úteis do gnu cli.
wp78de
14

No Windows, uso o 7zip : ele fornece uma interface gráfica do usuário, é gratuito e suporta uma ampla gama de formatos de arquivos, incluindo zip.

Navegue até a pasta que você deseja analisar no Windows Explorer. Procure *.zip, selecione todos os arquivos, clique com o botão direito do mouse, selecione "Arquivo de Teste"

insira a descrição da imagem aqui

Depois aguarde (observe que o explorer.exe leva cerca de 10 minutos para passar por 100.000 .zip antes do 7z iniciar o teste):

insira a descrição da imagem aqui

Franck Dernoncourt
fonte
8

A resposta de erik não funcionou para mim em um Mac, mas funciona para zips na pasta atual e em todas as subpastas:

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

Produz isso para cada arquivo:

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

Comando rápido do PowerShell - usando a opção "t" da linha de comando do 7zip

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

Saída

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

Abaixo está um script em Python para testar arquivos zip localizados em uma ou várias pastas. Eu testei no Windows 7 SP1 x64 Ultimate, mas esperaria que funcionasse em qualquer sistema operacional.

Exemplo de saída:

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

Roteiro:

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

Ele também grava um arquivo de log contendo todos os arquivos zip válidos, bem como um arquivo de log contendo todos os arquivos zip corrompidos.

Referência de velocidade contra 7zip: 577,64 segundos Python vs. 609 segundos 7zip

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Franck Dernoncourt
fonte