Bir klasördeki tüm zip dosyalarını bozuk olup olmadıklarını doğrulamak için nasıl test edebilirim?


23

Uzun zaman önce CFAtest adında ve bu işi çok iyi yapan bir yardımcı program vardı ama ortadan kayboldu.

Temel olarak, belirli bir yolu (tercihen alt klasörler dahil) geçecek ve bulduğu tüm zip dosyalarını test edecek benzer bir araç (tercihen grafiksel) arıyorum.

İyi günlükleme seçenekleri bir artı olacaktır.


4
Hangi işletim sistemi?
Matteo,

Herhangi bir son paketleyici arşiv bütünlüğü kontrollerini yapabilir.
Aşırı

Yanıtlar:


17

Her alt klasördeki her zip dosyasını bulun

Bu, geçerli klasörün tüm alt klasörlerinde .( -type f) uzantılı zip(veya ZIPveya Zipveya zIpbenzeri durumlarda, dikkate alınmayan ) dosyaları ( ) bulur -inameve bütünlüklerinin (seçenek -t) sessiz olup olmadığını (seçenek -qbirlikte -tq) sınar . Oldukça anlam ifade etmek: Zip dosyasının içeriğini listelemek değil, sadece test sonucunu bildirmek.

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

Sadece geçerli klasör (alt klasör yok)

Dosyaları yalnızca geçerli dizindeki dosyaları kontrol etmek istiyorsanız, alt klasörlerde değil

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

zip dosyaları ile dizinde. Dosya uzantıları için Bu aynı zamanda kontrol eder ZIPya Zipya zIpve benzeri, vaka yok sayılır.


1
Windows'daysanız ve sahip değilseniz find, Cygwin'i yükleyin.
Daniel R Hicks,

2
... veya forkomutu kullanın.
Karan,


2
Çok sayıda ZIP dosyası varsa veya çok sayıda dosya içeriyorsa, daha az ayrıntılı çıktı istenebilir. Bunun için unzip's -q seçeneğini kullanın: unzip -tq
malamut

1
Veya bir bash ve diğer pek çok yardımcı gnu cli aracıyla birlikte gelen Windows için git'i (zaten bir geliştiriciyseniz zaten sahip olabilirsiniz) yükleyin.
wp78de

15

Windows'da 7zip kullanıyorum : grafiksel bir kullanıcı arayüzü sağlar, ücretsizdir ve zip dahil çok çeşitli arşiv dosyası formatlarını destekler.

Windows Gezgini'nde analiz etmek istediğiniz belirli klasöre gidin. Ara *.zip, tüm dosyaları seç, sağ tıkla, "Test Arşivini" seç

görüntü tanımını buraya girin

Ardından bekleyin (explorer.exe'nin 7z testine başlamadan önce 100.000 .zip'ten geçmesi yaklaşık 10 dakika sürer):

görüntü tanımını buraya girin


8

erik'in cevabı Mac'te benim için işe yaramadı, ancak bu mevcut klasördeki ve tüm alt klasörlerdeki fermuarlar için çalışıyor:

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

Bunu her dosya için çıkarır:

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

2

Hızlı PowerShell komutu - 7zip'in komut satırı "t" anahtarını kullanarak

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

Çıktı

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

Bir veya birkaç klasörde bulunan zip dosyalarını test etmek için Python'da bir betiğin altında verilmiştir. Windows 7 SP1 x64 Ultimate'ta test ettim ancak herhangi bir işletim sisteminde çalışmasını beklerdim.

Çıktı örneği:

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

Senaryo:

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

Ayrıca, tüm geçerli zip dosyalarını içeren bir günlük dosyasını ve tüm bozuk zip dosyalarını içeren bir günlük dosyasını yazar.

7zip'e karşı hız testi: 577.64 saniye Python vs. 609 saniye 7zip

görüntü tanımını buraya girin

görüntü tanımını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.