Como dividir um arquivo zip em volumes INDEPENDENT

6

Tenho cerca de 12 GB de blocos de imagens compostos por cerca de 2 milhões de arquivos. Eu gostaria de zip-los para fazer a transferência para um servidor mais simples. Eu apenas pretendo armazenar os arquivos nos arquivos zip para transferência, sem compactação. O Helm está presente no servidor da Web e pode manipular arquivos descompactados.

Eu gostaria de apontar um programa para todos esses arquivos de uma só vez e fazer um zip em arquivos de aproximadamente 1 GB cada, mas cada arquivo zip precisa ser independente dos outros.

Eu tenho o 7-zip instalado com suporte a divisão entre volumes, mas esses volumes dependem um do outro para serem descompactados.

Alguém tem alguma sugestão? Agradecemos antecipadamente!

    
por Gavin 27.07.2010 / 11:44

6 respostas

3

O freeware no Windows chamado "Spinzip" deve fazer o trabalho para o seu propósito! ;) link

É baseado no IZARCC (incluído automaticamente no Spinzip). Você tem que verificar, mas o caminho original completo pode ser mantido nos arquivos compactados!

Veja ya

    
por 04.08.2010 / 15:39
3

Não tenho conhecimento de um programa que possa fazer isso, pois se você estiver fazendo um zip em vários volumes, todos estarão relacionados. Sua melhor aposta pode ser fazer 12 pastas e colocar um GB em cada uma, depois zipar as pastas individualmente.

    
por 27.07.2010 / 12:35
2

No final, criei um script python rápido para dividir os arquivos em sub-diretórios para mim antes de zipar cada um individualmente.

Caso seja útil para qualquer outra pessoa, aqui está meu script:

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()
    
por 01.08.2010 / 11:45
1

OK, aqui está uma saída, mas não tão boa assim. Você pode tentar se realmente precisar.

Suposições: você precisa dividir em 12 GB de dados em 3 DVDs de 4 GB.

Solução

  1. Tome 3 pen drives vazios de tamanho 4GB.
  2. Insira o pen drive # 1.
  3. Agora comece a copiar toda a pasta para o pen drive # 1 usando uma ferramenta como o TeraCopy que faz uma pausa em algum erro e não termina.
  4. Quando o pen drive # 1 estiver cheio, ele será pausado e no momento em que você puder mudar para o pen drive # 2.
  5. Agora retomar após o pen drive # 2 ser carregado.
  6. Repita a partir do passo 4 quando o pen drive # 2 estiver cheio. Apenas aumente o pen drive #.

Agora você tem seus dados divididos. Escreva-os para DVDs ou o que você quiser escrever.

Se você não tiver 3 pen drives, poderá gravar o primeiro DVD e excluir todos os dados no pen drive antes de retomar o processo de cópia.

    
por 27.07.2010 / 13:25
0

Agora usamos um programa gratuito chamado DirectorySlicer . Faz "cópias" (usa "hardlinks" se o destino é a mesma unidade, por isso não usa mais espaço em disco) os arquivos em pastas de um tamanho especificado. Isso nos ajuda a criar pastas de arquivos que cabem em um CD de 700MB.

NOTED DOWNSIDE: os arquivos não estão necessariamente na mesma ordem; ou seja, os nomes de arquivos sequenciados (como imagens de fotos) podem ser espalhados em "pedaços" para se ajustar melhor

Você pode criar arquivos ZIP de cada pasta.

Dê uma olhada no link é algo que usamos no passado para dividir um lote de arquivos em partes menores para caber em DVDs de 4,7 GB.

    
por 20.08.2013 / 16:16
0

O SpinZip é a ferramenta certa para nenhuma compressão. Eu queria usar compressão, então o resultado foi insatisfatório. O Zipsplit não funciona para arquivos acima de 2 GB, então acabei escrevendo meu próprio script perl rápido e sujo, que faz o seu trabalho. Sua adiciona arquivos para o arquivo, desde que o arquivo + arquivo seja menor que o máximo. tamanho especificado:

# 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;
}
    
por 29.07.2014 / 20:52