ฉันจะทดสอบไฟล์ zip ทั้งหมดในโฟลเดอร์เพื่อตรวจสอบว่าไฟล์เสียหายหรือไม่ได้อย่างไร


23

มียูทิลิตี้เมื่อนานมาแล้วที่เรียกว่า CFAtest ที่ทำสิ่งนี้ค่อนข้างดี แต่มันก็หายไป

โดยทั่วไปฉันกำลังมองหาเครื่องมือที่คล้ายกัน (แบบกราฟิกที่ดีกว่า) ที่จะสำรวจเส้นทางที่กำหนด (โดยเฉพาะอย่างยิ่งรวมถึงโฟลเดอร์ย่อย) และทดสอบไฟล์ซิปทั้งหมดที่พบ

ตัวเลือกการบันทึกที่มีคุณค่าจะเป็นข้อดี


4
ระบบปฏิบัติการใด
Matteo

ผู้บรรจุล่าสุดสามารถทำการตรวจสอบความสมบูรณ์ของการเก็บถาวรได้
Overmind

คำตอบ:


17

ค้นหาทุกไฟล์ซิปในทุกโฟลเดอร์ย่อย

นี้จะพบในโฟลเดอร์ย่อยทั้งหมดของโฟลเดอร์ปัจจุบัน ( .) ไฟล์ ( -type f) ที่มีนามสกุลzip(หรือZIPหรือZipหรือzIpอื่น ๆ กรณีถูกละเว้น-iname) และทดสอบความสมบูรณ์ของพวกเขา (ตัวเลือก-t) จะเงียบ (ตัวเลือก-qร่วมกัน-tq) กำลังหมายถึงค่อนข้าง: ไม่แสดงรายการเนื้อหาของไฟล์ zip แต่เพียงรายงานผลการทดสอบ

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

แค่โฟลเดอร์ปัจจุบัน (ไม่มีโฟลเดอร์ย่อย)

หากคุณเพียงต้องการตรวจสอบไฟล์ในไดเรกทอรีปัจจุบันและไม่อยู่ในโฟลเดอร์ย่อยให้ใช้

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

ในไดเรกทอรีด้วยไฟล์ซิป นอกจากนี้ยังตรวจสอบนามสกุลไฟล์ZIPหรือZipหรือzIpและอื่น ๆ กรณีจะถูกละเว้น


1
และถ้าคุณอยู่บน Windows และไม่มีfindให้ติดตั้ง Cygwin
Daniel R Hicks

2
... หรือใช้forคำสั่ง
Karan

... หรือดาวน์โหลดgnuwin32.sourceforge.net
Franck Dernoncourt

2
หากมีไฟล์ ZIP หลายไฟล์หรือหากมีไฟล์จำนวนมากอาจต้องการเอาท์พุท verbose น้อยกว่า ใช้ตัวเลือก -q ของ unzip สำหรับสิ่งนั้น: unzip -tq
malamut

1
หรือติดตั้ง git สำหรับ Windows (คุณอาจมีอยู่แล้วหากคุณเป็นผู้พัฒนา) ซึ่งมาพร้อมกับ bash และเครื่องมือ gnu cli ที่เป็นประโยชน์อื่น ๆ อีกมากมาย
wp78de

15

ใน Windows ฉันใช้7zip : มันมีส่วนต่อประสานกราฟิกกับผู้ใช้ฟรีและรองรับไฟล์เก็บถาวรหลากหลายรูปแบบรวมถึง zip

นำทางไปยังโฟลเดอร์ที่คุณต้องการวิเคราะห์บน Windows Explorer ค้นหา*.zipเลือกไฟล์ทั้งหมดคลิกขวาเลือก "ทดสอบที่เก็บถาวร"

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นรอ (โปรดทราบว่าใช้เวลาประมาณ 10 นาทีก่อนที่ explorer.exe จะผ่าน 100,000 .zip ก่อน 7z เริ่มการทดสอบ):

ป้อนคำอธิบายรูปภาพที่นี่


8

คำตอบของ erik ไม่ได้ผลสำหรับฉันบน Mac แต่ใช้ได้กับรหัสไปรษณีย์ในโฟลเดอร์ปัจจุบันและโฟลเดอร์ย่อยทั้งหมด:

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

เอาต์พุตนี้สำหรับแต่ละไฟล์:

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

2

คำสั่ง PowerShell อย่างรวดเร็ว - ใช้สวิตช์ "t" commandline ของ 7zip

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

เอาท์พุต

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

ด้านล่างเป็นสคริปต์ใน Python เพื่อทดสอบ zipfiles ที่อยู่ในหนึ่งหรือหลายโฟลเดอร์ ฉันทดสอบกับ Windows 7 SP1 x64 Ultimate แต่ฉันคาดว่ามันจะทำงานบนระบบปฏิบัติการใด ๆ

ตัวอย่างผลลัพธ์:

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

สคริปต์:

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

นอกจากนี้ยังเขียนไฟล์บันทึกที่มีไฟล์ซิปที่ถูกต้องทั้งหมดรวมถึงไฟล์บันทึกที่มีไฟล์ซิปที่เสียหายทั้งหมด

มาตรฐานความเร็วเทียบกับ 7zip: 577.64 วินาที Python เทียบกับ 609 วินาที 7zip

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.