web-dev-qa-db-ja.com

独立したボリューム間でZipファイルを分割する方法

約200万のファイルで構成される約12GBの画像タイルがあります。サーバーへの転送を簡単にするために、これらを圧縮したいと思います。圧縮せずに、転送用にファイルをZipファイルに保存する予定です。 HelmはWebサーバー上に存在し、ファイルの解凍を処理できます。

プログラムを一度にすべてのこれらのファイルに向けて、それぞれ約1 GBのファイルに圧縮するようにしたいのですが、各Zipファイルは他のファイルから独立している必要があります。

7-Zipをインストールし、ボリューム間での分割をサポートしていますが、これらのボリュームは互いに依存して解凍されます。

誰か提案がありますか?前もって感謝します!

6
Gavin

「Spinzip」と呼ばれるWindows上のフリーウェアはあなたの目的のために仕事をするはずです! ;) http://skwire.dcmembers.com/wb/pages/software/spinzip.php

これはIZARCC(Spinzipに自動的に含まれる)に基づいています。確認する必要がありますが、元の完全なパスがzipファイルに保存されている可能性があります。

じゃあ

3
Erb

複数のボリュームで1つのZipを作成している場合、それらはすべて関連しているため、これを実行できるプログラムを私は知りません。最善の策は、12個のフォルダーを作成し、それぞれにGBを入れてから、フォルダーを個別に圧縮することです。

3
JNK

最後に、簡単なpythonスクリプトを作成して、ファイルをサブディレクトリに分割してから、それぞれを個別に圧縮しました。

他の人に役立つ場合に備えて、次のスクリプトを使用します。

import os
import csv
import shutil

def SplitFilesIntoGroups(dirsrc, dirdest, bytesperdir):
    dirno = 1
    isdircreated = False
    bytesprocessed = 0

    for file in os.listdir(dirsrc):
        filebytes = os.path.getsize(dirsrc+'\\'+file)

        #start new dir?
        if bytesprocessed+filebytes > bytesperdir:
            dirno += 1
            bytesprocessed = 0
            isdircreated = False

        #create dir?
        if isdircreated == False:
            os.makedirs(dirdest+'\\'+str(dirno))
            isdircreated = True

        #copy file
        shutil.copy2(dirsrc+'\\'+file, dirdest+'\\'+str(dirno)+'\\'+file)
        bytesprocessed += filebytes

def Main():
    dirsrc='C:\\Files'
    dirdest='C:\\Grouped Files'

    #1,024,000,000 = approx 1gb
    #512,000,000 = approx 500mb
    SplitFilesIntoGroups(dirsrc, dirdest, 512000000) 

if __name__ == "__main__":
    Main()
2
Gavin

ここでOKはそれから抜け出す方法ですが、それほど良いわけではありません。本当に必要な場合は試すことができます。

前提条件:12GBのデータを3枚の4GBDVDに分割する必要があります。

ソリューション

  1. サイズ4GBの空のペンドライブを3つ取ります。
  2. ペンドライブ#1を挿入します。
  3. ここで、 TeraCopy のようなツールを使用して、フォルダー全体をペンドライブ#1にコピーし始めます。このツールは、エラーが発生すると一時停止し、終了しません。
  4. ペンドライブ#1がいっぱいになると一時停止し、ペンドライブ#2に変更できるようになります。
  5. ペンドライブ#2がロードされた後、再開します。
  6. ペンドライブ#2がいっぱいになったら、手順4から繰り返します。ペンドライブ#を増やすだけです。

これで、データが分割されました。 DVDや書きたいものに書いてください。

ペンドライブが3つない場合は、最初のDVDをそこに書き込んでから、コピープロセスを再開する前に、ペンドライブのデータ全体を削除できます。

1
IsmailS

SpinZipは、圧縮を行わないための厳密なツールです。圧縮を使用したかったので、結果は不十分でした。 Zipsplitは2GBを超えるファイルでは機能しないため、私は自分ですばやく汚いPerlスクリプトを作成することになりました。ファイル+アーカイブが最大値よりも低い限り、アーカイブにファイルを追加します。指定サイズ:

# Use strict Variable declaration
use strict;
use warnings;
use File::Find;

# use constant MAXSIZE    => 4700372992; # DVD File size
use constant MAXSIZE    => 1566790997; # File size for DVD to keep below 2GB limit
# use constant MAXSIZE    => 100000000; # Test

use constant ROOTDIR    => 'x:/dir_to_be_zipped'; # to be zipped directory

my $zipfilename    = "backup"; # Zip file name
my $zipfileext    = "Zip"; # extension

my $counter = 0;
my $zipsize = undef;
my $flushed = 1;

my $arr = [];

find({wanted =>\&wanted, no_chdir => 1}, ROOTDIR);

flush(@{$arr});

# Callback function of FIND
sub wanted {
    my $filesize = (-s $File::Find::name);

    LABEL: {
        if ($flushed) {
            $zipsize = (-s "$zipfilename$counter.$zipfileext");
            $zipsize = 0 unless defined $zipsize;

            printf("Filesize Zip-File %s: %d\n", 
                "$zipfilename$counter.$zipfileext", $zipsize);

            $flushed = 0;

            if (($zipsize + $filesize) >= MAXSIZE) {
                $counter++;
                $flushed = 1;
                printf("Use next Zip File %d, Filesize old File: %d\n",
                    $counter, ($zipsize + $filesize));
                goto LABEL;
            }
        }
    }

    if ( $zipsize + $filesize  < MAXSIZE ) {
        printf("Adding %s (%d) to Buffer %d (%d)\n",
            $File::Find::name, $filesize, $counter, $zipsize);

        Push @{$arr}, $File::Find::name;
        $zipsize += $filesize;
    }
    else {
        printf("Flushing File Buffer\n");
        flush(@{$arr});

        $flushed = 1;
        $arr = [];
        goto LABEL;

    }
}

# Flush File array to Zip file
sub flush {

    # open handle to write to STDIN of Zip call
    open(my $fh, "|Zip -9 $zipfilename$counter.$zipfileext -@")
        or die "cannot open < $zipfilename$counter.$zipfileext: $!";

    printf("Adding %d files\n", scalar(@_));
    print $fh map {$_, "\n"} @_;
    close $fh;
}
0
hwol

現在、 DirectorySlicer というフリープログラムを使用しています。ファイルを指定されたサイズのフォルダに「コピー」します(宛先が同じドライブの場合は「ハードリンク」を使用するため、ドライブ領域を消費しません)。これは、700MBのCDに収まるファイルのフォルダーを作成するのに役立ちます。

ダウンサイドに注意:ファイルは必ずしも同じ順序である必要はありません。つまり、シーケンスされたファイル名(写真画像など)は、より適切にフィットするように「チャンク」全体に分散される可能性があります

その後、各フォルダのZipファイルを作成できます。


見てください http://bkprograms.weebly.com/folder-axe.html これは、4.7GBに収まるようにファイルのバッチを小さなチャンクに分割するために過去に使用したものです。 DVD。

0
J. Chin