Comment puis-je tester tous les fichiers zip dans un dossier pour vérifier s'ils sont corrompus ou non?


22

Il y a longtemps, un utilitaire appelé CFAtest le faisait très bien, mais il a disparu.

Fondamentalement, je recherche un outil similaire (de préférence graphique) qui parcourt un chemin donné (incluant de préférence des sous-dossiers) et teste tous les fichiers zip qu'il trouve.

Des options de journalisation décentes seraient un plus.


4
Quel système d'exploitation?
Matteo

Tout emballeur récent peut effectuer des contrôles d'intégrité d'archive.
Overmind

Réponses:


16

Trouver chaque fichier zip dans chaque sous-dossier

Cela trouvera dans tous les sous-dossiers du dossier en cours ( .) les fichiers ( -type f) avec l'extension zip(ou ZIPou Zipou zIpet ainsi de suite, la casse est ignorée -iname), et testera leur intégrité (option -t) en étant silencieux (option -q, ensemble -tq). Être assez moyen signifie: Ne pas lister le contenu du fichier zip, mais ne rapporter que les résultats du test.

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

Juste le dossier actuel (pas de sous-dossiers)

Si vous voulez juste vérifier les fichiers dans le répertoire courant, et non dans les sous-dossiers, utilisez

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

dans le répertoire avec les fichiers zip. Cela vérifie également les extensions de fichier ZIPet / Zipou zIpainsi de suite, la casse est ignorée.


1
Et si vous êtes sous Windows et n’en avez pas find, installez Cygwin.
Daniel R Hicks

2
... ou utilisez la forcommande.
Karan


2
S'il existe de nombreux fichiers ZIP ou s'ils en contiennent, une sortie moins détaillée peut être souhaitée. Utilisez l'option -q de unzip pour cela: unzip -tq
malamut

1
Ou installez git pour Windows (vous l’avez peut-être déjà si vous êtes développeur), qui vient avec une bash et de nombreux autres outils utiles de gnu cli.
wp78de

14

Sous Windows, j'utilise 7zip : il fournit une interface utilisateur graphique, est gratuit et prend en charge un large éventail de formats de fichiers d'archives, y compris zip.

Naviguez jusqu'au dossier que vous souhaitez analyser dans l'explorateur Windows. Rechercher *.zip, sélectionner tous les fichiers, cliquer avec le bouton droit de la souris, sélectionner "Test Archive"

entrez la description de l'image ici

Puis attendez (notez qu'il faut environ 10 minutes à explorer.exe pour parcourir 100 000 .zip avant que 7z ne commence les tests):

entrez la description de l'image ici


8

La réponse de erik n'a pas fonctionné pour moi sur un Mac, mais cela fonctionne pour les zips du dossier en cours et de tous les sous-dossiers:

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

Affiche ceci pour chaque fichier:

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

2

Commande rapide PowerShell - Utilisation du commutateur "t" de la ligne de commande de 7zip

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

Sortie

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

Voici ci-dessous un script en Python pour tester les fichiers zip situés dans un ou plusieurs dossiers. Je l'ai testé sous Windows 7 SP1 x64 Ultimate, mais je m'attendrais à ce qu'il fonctionne sous n'importe quel système d'exploitation.

Exemple de sortie:

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

Scénario:

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

Il écrit également un fichier journal contenant tous les fichiers zip valides ainsi qu'un fichier journal contenant tous les fichiers zip corrompus.

Indice de vitesse contre 7zip: 577,64 secondes Python contre 609 secondes 7zip

entrez la description de l'image ici

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.