Wie kann ich alle ZIP-Dateien in einem Ordner testen, um zu überprüfen, ob sie beschädigt sind oder nicht?

20

Es gab vor langer Zeit ein Hilfsprogramm namens CFAtest, das dies recht gut machte, aber es ist verschwunden.

Grundsätzlich suche ich nach einem ähnlichen Tool (vorzugsweise grafisch), das einen bestimmten Pfad (vorzugsweise einschließlich Unterordner) durchläuft und alle gefundenen ZIP-Dateien testet.

Ordentliche Protokollierungsoptionen wären von Vorteil.

isarris
quelle
4
Welches Betriebssystem?
Matteo
Jeder neuere Packer kann Archivintegritätsprüfungen durchführen.
Overmind

Antworten:

15

Finde jede Zip-Datei in jedem Unterordner

Dies wird in allen Unterordnern des aktuellen Ordners zu finden ( . ) die Dateien ( -type f ) mit der Erweiterung zip (oder ZIP oder Zip oder zIp und so weiter wird der Fall ignoriert, -iname ) und testen Sie ihre Integrität (Option -t leise sein (Option -qzusammen -tq ). Ganz zu sein bedeutet: Nicht den Inhalt der zip-Datei auflisten, sondern nur Testergebnisse melden.

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

Nur aktueller Ordner (keine Unterordner)

Wenn Sie nur die Dateien im aktuellen Verzeichnis und nicht in Unterordnern überprüfen möchten, verwenden Sie

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

im verzeichnis mit den zip dateien. Dadurch wird auch nach Dateierweiterungen gesucht ZIP oder Zip oder zIp und so weiter wird Groß- und Kleinschreibung ignoriert.

erik
quelle
Und wenn Sie auf Windows sind und nicht haben find, Cygwin installieren.
Daniel R Hicks
2
... oder benutze die for Befehl.
Karan
... oder herunterladen gnuwin32.sourceforge.net
Franck Dernoncourt
2
Wenn es viele ZIP-Dateien gibt oder wenn sie viele Dateien enthalten, ist möglicherweise weniger ausführliche Ausgabe erwünscht. Verwenden Sie dazu die Option -q von unzip: unzip -tq
malamut
1
Oder installieren Sie git für Windows (möglicherweise haben Sie es bereits, wenn Sie ein Entwickler sind), das mit einer Bash und vielen anderen hilfreichen Gnu-Cli-Tools geliefert wird.
wp78de
14

Unter Windows benutze ich 7zip : Es bietet eine grafische Benutzeroberfläche, ist kostenlos und unterstützt eine Vielzahl von Archivdateiformaten, einschließlich zip.

Navigieren Sie in Windows Explorer zu dem angegebenen Ordner, den Sie analysieren möchten. Suchen nach *.zip, alle Dateien auswählen, mit der rechten Maustaste klicken, "Testarchiv" auswählen

enter image description here

Warten Sie dann (beachten Sie, dass es ungefähr 10 Minuten dauert, bis explorer.exe 100.000 .zip durchläuft, bevor 7z mit dem Testen beginnt):

enter image description here

Franck Dernoncourt
quelle
8

Die Antwort von erik hat auf einem Mac für mich nicht funktioniert, aber dies funktioniert für Reißverschlüsse im aktuellen Ordner und in allen Unterordnern:

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

Gibt dies für jede Datei aus:

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

Schneller PowerShell-Befehl - Verwenden der 7zip-Befehlszeile "t" wechseln

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

Ausgabe

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

Im Folgenden finden Sie ein Skript in Python zum Testen von Zip-Dateien, die sich in einem oder mehreren Ordnern befinden. Ich habe es auf Windows 7 SP1 x64 Ultimate getestet, aber ich würde erwarten, dass es auf jedem Betriebssystem funktioniert.

Ausgabebeispiel:

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

Skript:

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

Es schreibt auch eine Protokolldatei mit allen gültigen ZIP-Dateien sowie eine Protokolldatei mit allen beschädigten ZIP-Dateien.

Geschwindigkeits-Benchmark gegen 7zip: 577,64 Sekunden Python vs. 609 Sekunden 7zip

enter image description here

enter image description here

Franck Dernoncourt
quelle