フォルダー内のすべてのzipファイルをテストして、破損しているかどうかを確認するにはどうすればよいですか?


22

かなり前にCFAtestと呼ばれるユーティリティがあり、これを非常にうまく行っていましたが、消えてしまいました。

基本的に、特定のパス(サブフォルダーを含むことが望ましい)を横断し、検出されたすべてのzipファイルをテストする同様のツール(できればグラフィカル)を探しています。

適切なロギングオプションはプラスになります。


4
どのオペレーティングシステムですか?
マッテオ

最近のパッカーはアーカイブの整合性チェックを行うことができます。
オーバーマインド

回答:


16

すべてのサブフォルダーですべてのzipファイルを検索します

これにより、現在のフォルダー(.)のすべてのサブフォルダーで-type f拡張子zip(またはZIPor Zipor 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をインストールしてください。
ダニエルRヒックス

2
...またはforコマンドを使用します。
カラン


2
多くのZIPファイルがある場合、またはそれらに多くのファイルが含まれている場合、より詳細な出力が必要になることがあります。そのためにunzipの-qオプションを使用します
。unzip

1
または、bashやその他の便利なgnu cliツールが付属しているgit for Windowsをインストールします(開発者の場合は既に持っているかもしれません)。
wp78de

14

Windowsでは7zipを使用します。グラフィカルユーザーインターフェイスを提供し、無料で、zipなどの幅広いアーカイブファイル形式をサポートしています。

Windowsエクスプローラーで分析する特定のフォルダーに移動します。を検索し*.zip、すべてのファイルを選択して右クリックし、「アーカイブのテスト」を選択します

ここに画像の説明を入力してください

次に待機します(explorer.exeが100,000 .zipを通過してから7zがテストを開始するまでに約10分かかることに注意してください):

ここに画像の説明を入力してください


8

erikの答えはMacではうまくいきませんでしたが、これは現在のフォルダーとすべてのサブフォルダーのzipで機能します:

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


0

1つまたは複数のフォルダーにあるzipファイルをテストするPythonのスクリプトを以下に示します。Windows 7 SP1 x64 Ultimateでテストしましたが、どのOSでも動作するはずです。

出力の例:

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

ここに画像の説明を入力してください

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.