Як я можу перевірити всі поштові файли в папці, щоб перевірити, чи вони пошкоджені чи ні?


23

Дуже давно була утиліта під назвою CFAtest, яка робила це досить непогано, але вона зникла.

В основному, я шукаю подібний інструмент (бажано графічний), який пройде певний шлях (бажано, включаючи вкладені папки) і перевіряє всі поштові файли, які він знайде.

Варіанти пристойного ведення журналу були б плюсом.


4
Яка операційна система?
Маттео

Будь-який останній пакувач може зробити перевірку цілісності архіву.
Перемогти

Відповіді:


17

Знайдіть кожен 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і так далі, регістр ігнорується.


1
А якщо ви перебуваєте в Windows і у вас немає find, встановіть Cygwin.
Даніель Р Хікс

2
... або використовувати forкоманду.
Каран

... або завантажити gnuwin32.sourceforge.net
Франк

2
Якщо є багато ZIP-файлів або вони містять багато файлів, може бути бажаним менший багатослівний вихід. Використовуйте для цього опцію -ziq: unzip -tq
malamut

1
Або встановіть git для Windows (можливо, у вас це вже є розробником), який постачається з bash та багатьма іншими корисними інструментами gnu cli.
wp78de

15

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

Перейдіть до заданої папки, яку ви хочете проаналізувати в Провіднику Windows. Знайдіть *.zip, виберіть усі файли, клацніть правою кнопкою миші, виберіть «Тестувати архів»

введіть тут опис зображення

Потім зачекайте (зауважте, що перед тим, як explorer.exe пройти 100 000 .zip до початку тестування, потрібно 10 хвилин):

введіть тут опис зображення


8

Відповідь erik не працювала для мене на Mac, але це працює для блискавок у поточній папці та всіх папках:

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

Виводить це для кожного файлу:

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

2

Швидка команда PowerShell - за допомогою перемикача "t" командного рядка 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 для тестування поштових файлів, розташованих в одній або декількох папках. Я тестував його на 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-файли.

Орієнтир швидкості проти 7zip: 577,64 секунди Python проти 609 секунд 7zip

введіть тут опис зображення

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.