21

Давным-давно была утилита CFAtest, которая делала это довольно хорошо, но она исчезла.

По сути, я ищу похожий инструмент (предпочтительно графический), который будет проходить по заданному пути (предпочтительно с вложенными папками) и проверять все найденные файлы zip.

Достойные варианты регистрации будет плюсом.

6 ответов6

15

Найти каждый zip-файл в каждой подпапке

Он найдет во всех подпапках текущей папки (.) Файлы (-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 или zIp и т.д., Регистр игнорируется.

14

В Windows я использую 7zip: он предоставляет графический интерфейс пользователя, бесплатен и поддерживает широкий спектр форматов архивных файлов, включая zip.

Перейдите к папке, которую вы хотите проанализировать в проводнике Windows. Найдите *.zip , выберите все файлы, щелкните правой кнопкой мыши, выберите "Архив тестов"

Затем подождите (учтите, что для explorer.exe требуется около 10 минут, чтобы пройти 100 000 .zip до начала тестирования 7z):

8

Ответ Эрика не работал для меня на Mac, но это работает для почтовых индексов в текущей папке и всех подпапках:

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

Выводит это для каждого файла:

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

Быстрая команда PowerShell - с помощью командной строки 7zip "t"

$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
1

Это может быть не совсем то, что вы просили, но есть инструмент с именем Zip2Fix.

Я не использовал его, но вы можете скачать его здесь:

http://leelusoft.blogspot.com/2011/06/zip2fix-10.html

0

Ниже приведен скрипт на Python для тестирования zip-файлов, расположенных в одной или нескольких папках. Я протестировал его на 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

Он также записывает файл журнала, содержащий все допустимые файлы ZIP, а также файл журнала, содержащий все поврежденные файлы ZIP.

Тест скорости против 7zip: 577,64 секунды Python против 609 секунд 7zip

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .