Làm cách nào tôi có thể kiểm tra tất cả các tệp zip trong một thư mục để xác minh xem chúng có bị hỏng hay không?


22

Có một tiện ích từ lâu được gọi là CFAtest đang thực hiện điều này khá độc đáo, nhưng nó đã biến mất.

Về cơ bản, tôi đang tìm kiếm một công cụ tương tự (tốt nhất là đồ họa) sẽ đi qua một đường dẫn nhất định (tốt nhất là bao gồm các thư mục con) và kiểm tra tất cả các tệp zip mà nó tìm thấy.

Tùy chọn đăng nhập Decent sẽ là một cộng.


4
Hệ điều hành nào?
Matteo

Bất kỳ nhà đóng gói gần đây có thể thực hiện kiểm tra tính toàn vẹn lưu trữ.
Overmind

Câu trả lời:


16

Tìm mọi tệp zip trong mỗi thư mục con

Điều này sẽ tìm thấy trong tất cả các thư mục con của thư mục hiện tại ( .) các tệp ( -type f) có phần mở rộng zip( ZIPhoặc Ziphoặc zIp, v.v., trường hợp bị bỏ qua, -iname) và kiểm tra tính toàn vẹn (tùy chọn -t) của chúng là yên lặng (tùy chọn -q, cùng nhau -tq). Khá có nghĩa là: Không liệt kê nội dung của tệp zip, mà chỉ báo cáo kết quả kiểm tra.

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

Chỉ thư mục hiện tại (không có thư mục con)

Nếu bạn chỉ muốn kiểm tra các tệp trong thư mục hiện tại chứ không phải trong bất kỳ thư mục con nào, hãy sử dụng

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

trong thư mục với các tập tin zip. Điều này cũng kiểm tra các phần mở rộng tập tin ZIPhay Ziphay zIpvà như vậy, trường hợp bị bỏ qua.


1
Và nếu bạn đang dùng Windows và không có find, hãy cài đặt Cygwin.
Daniel R Hicks

2
... Hoặc sử dụng forlệnh.
Karan

... hoặc tải xuống gnuwin32.sourceforge.net
Franck Dernoncourt

2
Nếu có nhiều tệp ZIP hoặc nếu chúng chứa nhiều tệp, có thể cần ít đầu ra dài dòng hơn. Sử dụng tùy chọn -q của unzip cho điều đó: unzip -tq
malamut 19/03/2016

1
Hoặc cài đặt git cho Windows (bạn có thể đã có nó nếu bạn là nhà phát triển) đi kèm với bash và nhiều công cụ gnu cli hữu ích khác.
wp78de

14

Trên Windows tôi sử dụng 7zip : nó cung cấp giao diện người dùng đồ họa, miễn phí và hỗ trợ một loạt các định dạng tệp lưu trữ bao gồm zip.

Điều hướng đến thư mục đã cho mà bạn muốn phân tích trên Windows Explorer. Tìm kiếm *.zip, chọn tất cả các tệp, nhấp chuột phải, chọn "Kiểm tra Lưu trữ"

nhập mô tả hình ảnh ở đây

Sau đó chờ đợi (lưu ý rằng phải mất khoảng 10 phút để explorer.exe đi qua 100.000 .zip trước khi 7z bắt đầu thử nghiệm):

nhập mô tả hình ảnh ở đây


8

Câu trả lời của erik không hoạt động với tôi trên máy Mac nhưng điều này hoạt động với các khóa trong thư mục hiện tại và tất cả các thư mục con:

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

Đầu ra này cho mỗi tệp:

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

2

Lệnh PowerShell nhanh - sử dụng công tắc "t" của lệnh 7zip

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

Đầu ra

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

Dưới đây là tập lệnh trong Python để kiểm tra các tệp zip nằm trong một hoặc một số thư mục. Tôi đã thử nghiệm nó trên Windows 7 SP1 x64 Ultimate nhưng tôi hy vọng nó sẽ hoạt động trên mọi hệ điều hành.

Ví dụ về đầu ra:

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

Kịch bản:

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

Nó cũng ghi một tệp nhật ký chứa tất cả các tệp zip hợp lệ cũng như một tệp nhật ký chứa tất cả các tệp zip bị hỏng.

Tốc độ điểm chuẩn so với 7zip: 577,64 giây Python so với 609 giây 7zip

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.