Bagaimana saya bisa menguji semua file zip dalam folder untuk memverifikasi apakah mereka rusak atau tidak?


22

Ada sebuah utilitas yang dulu disebut CFAtest yang melakukan ini dengan sangat baik, tetapi telah menghilang.

Pada dasarnya, saya mencari alat serupa (lebih disukai grafis) yang akan melintasi jalur yang diberikan (lebih disukai termasuk subfolder) dan menguji semua file zip yang ditemukannya.

Opsi logging yang layak akan menjadi nilai tambah.


4
Sistem operasi apa?
Matteo

Setiap paket terbaru dapat melakukan pemeriksaan integritas arsip.
Overmind

Jawaban:


16

Temukan setiap file zip di setiap subfolder

Ini akan menemukan di semua subfolder dari folder saat ini ( .) file ( -type f) dengan ekstensi zip(atau ZIPatau Zipdan zIpdan seterusnya, case diabaikan, -iname) dan menguji integritas mereka (opsi -t) menjadi sunyi (opsi -q, bersama-sama -tq). Menjadi cukup berarti: Tidak mencantumkan konten file zip, tetapi hanya melaporkan hasil tes.

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

Hanya folder saat ini (tidak ada subfolder)

Jika Anda hanya ingin memeriksa file di direktori saat ini, dan tidak di subfolder, gunakan

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

dalam direktori dengan file zip. Ini juga memeriksa ekstensi file ZIPatau Zipatau zIpdan sebagainya, case diabaikan.


1
Dan jika Anda menggunakan Windows dan tidak memilikinya find, instal Cygwin.
Daniel R Hicks

2
... atau gunakan forperintah.
Karan


2
Jika ada banyak file ZIP, atau jika mengandung banyak file, lebih sedikit keluaran yang diinginkan mungkin diinginkan. Gunakan opsi -z unzip untuk itu: unzip -tq
malamut

1
Atau instal git untuk Windows (Anda mungkin sudah memilikinya jika Anda adalah seorang pengembang) yang dilengkapi dengan sebuah bash dan banyak alat gnu cli lainnya yang bermanfaat.
wp78de

14

Pada Windows saya menggunakan 7zip : ini menyediakan antarmuka pengguna grafis, gratis dan mendukung berbagai format file arsip termasuk zip.

Arahkan ke folder yang diberikan yang ingin Anda analisis pada Windows Explorer. Cari *.zip, pilih semua file, klik kanan, pilih "Test Archive"

masukkan deskripsi gambar di sini

Kemudian tunggu (perhatikan bahwa diperlukan sekitar 10 menit untuk explorer.exe melewati 100.000 .zip sebelum 7z memulai pengujian):

masukkan deskripsi gambar di sini


8

jawaban erik tidak berfungsi untuk saya di Mac tetapi ini berfungsi untuk ritsleting di folder saat ini dan semua subfolder:

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

Output ini untuk setiap file:

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

2

Perintah PowerShell Cepat - menggunakan saklar "t" commandline 7zip

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

Keluaran

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

Berikut ini adalah skrip Python untuk menguji zipfile yang terletak di satu atau beberapa folder. Saya mengujinya pada Windows 7 SP1 x64 Ultimate tetapi saya berharap itu berfungsi pada OS apa pun.

Contoh output:

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

Naskah:

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

Itu juga menulis file log yang berisi semua file zip yang valid serta file log yang berisi semua file zip yang rusak.

Pembandingan kecepatan terhadap 7zip: 577,64 detik Python vs 609 detik 7zip

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.