Dividi i file usando tar, gz, zip o bzip2 [chiuso]


144

Devo comprimere un file di grandi dimensioni di circa 17-20 GB. Ho bisogno di dividerlo in diversi file di circa 1 GB per file.

Ho cercato una soluzione tramite Google e ho trovato il modo di utilizzare splite catcomandi. Ma non hanno funzionato per file di grandi dimensioni. Inoltre, non funzioneranno in Windows; Devo estrarlo su un computer Windows.


3
Sento il tuo dolore ma questo non sembra essere legato alla programmazione.
Jason S,

1
Molti programmi di compressione (ad esempio 7-Zip) sono in grado di suddividere il file compresso in volumi di dimensioni specificate per una distribuzione più semplice.
Martin Liversage,

Questo appartiene a superuser.com, ma la beta privata non inizia fino a domani, mi è stato detto.
Jesper,

Posso chiederti perché hai bisogno di quel file compresso?
Jan Jungnickel,

Se una delle due soluzioni praticabili pubblicate qui non esce, avrà bisogno di una soluzione di programmazione.
Giosuè,

Risposte:


253

È possibile utilizzare il splitcomando con l' -bopzione:

split -b 1024m file.tar.gz

Può essere riassemblato su un computer Windows usando la risposta di @ Joshua .

copy /b file1 + file2 + file3 + file4 filetogether

Modifica : come affermato da @Charlie nel commento qui sotto, potresti voler impostare esplicitamente un prefisso perché userà xdiversamente, il che può essere fonte di confusione.

split -b 1024m "file.tar.gz" "file.tar.gz.part-"

// Creates files: file.tar.gz.part-aa, file.tar.gz.part-ab, file.tar.gz.part-ac, ...

Modifica : modifica del post perché la domanda è chiusa e la soluzione più efficace è molto vicina al contenuto di questa risposta:

# create archives
$ tar cz my_large_file_1 my_large_file_2 | split -b 1024MiB - myfiles_split.tgz_
# uncompress
$ cat myfiles_split.tgz_* | tar xz

Questa soluzione evita la necessità di utilizzare un file di grandi dimensioni intermedio durante la (de) compressione. Utilizzare l'opzione tar -C per utilizzare una directory diversa per i file risultanti. tra l'altro se l'archivio è costituito da un solo file, si potrebbe evitare tar e usare solo gzip:

# create archives
$ gzip -c my_large_file | split -b 1024MiB - myfile_split.gz_
# uncompress
$ cat myfile_split.gz_* | gunzip -c > my_large_file

Per Windows è possibile scaricare versioni portate degli stessi comandi o utilizzare cygwin.


7
se non aggiungi un prefisso come ultimo argomento dopo la divisione del nome file, ottieni l'output nei file denominati xaa, xab, xac, xad ....
Charlie

@ Charlie, grazie, ho aggiornato la mia risposta.
matpie,

2
L'utilizzo effettivo ha -b 1024MiBdato un errore indicante che si trattava di un numero non valido di byte. Usare le --bytes=1024mopere.
Brian,

E non è necessario utilizzare catper riassemblare il file. Puoi usarlo copy /b file1 + file2 + etc..su Windows, quindi copiarlo di nuovo su Linux e tar può leggere il tarball riassemblato. L'ho appena provato.
Brian,

1
Dividi ha l'opzione --numeric-suffixes: usa i suffissi numerici anziché alfabetici.
Dr. Jan-Philip Gehrcke,

27

Se ti stai separando da Linux, puoi ancora riassemblarlo in Windows.

copy /b file1 + file2 + file3 + file4 filetogether

Puoi anche utilizzare copy /b file* filetogether- support.microsoft.com/kb/71161
eug

5
Funziona correttamente solo su NTFS e se i file sono già nell'ordinamento NTFS. Provalo su FAT o FAT32 = boom.
Giosuè,

+1 assicurati che i file siano nell'ordine giusto!
Brian,

@Joshua Per essere onesti, se non lo sono, hai fatto un pessimo lavoro di denominazione.
jpmc26,

@ jpmc26: sai delle cattive abitudini di riordino della directory di FAT32, giusto?
Giosuè,


8

Codice testato, inizialmente crea un singolo file di archivio, quindi lo divide:

 gzip -c file.orig > file.gz
 CHUNKSIZE=1073741824
 PARTCNT=$[$(stat -c%s file.gz) / $CHUNKSIZE]

 # the remainder is taken care of, for example for
 # 1 GiB + 1 bytes PARTCNT is 1 and seq 0 $PARTCNT covers
 # all of file
 for n in `seq 0 $PARTCNT`
 do
       dd if=file.gz of=part.$n bs=$CHUNKSIZE skip=$n count=1
 done

Questa variante omette la creazione di un singolo file di archivio e va direttamente alla creazione di parti:

gzip -c file.orig |
    ( CHUNKSIZE=1073741824;
        i=0;
        while true; do
            i=$[i+1];
            head -c "$CHUNKSIZE" > "part.$i";
            [ "$CHUNKSIZE" -eq $(stat -c%s "part.$i") ] || break;
        done; )

In questa variante, se la dimensione del file dell'archivio è divisibile per $CHUNKSIZE, l'ultimo file parziale avrà dimensioni del file 0 byte.


1
Questo è splitgià ciò che fa.
effimero

1
effimero Ehi, ho scavato qualche post cercando proprio QUELLO. Non ho comandi / binari suddivisi né zip su un certo dispositivo, e questo ha funzionato perfettamente. Preparerò questo codice per funzionare come comando diviso :). Grazie mille ad Adrian Panasiuk. Questo è perfetto per me.
m3nda,

@ erm3nda Prego, felice che aiuti!
Adrian Panasiuk,

Ma ho provato e il risultato è stato un file completo, non diviso. Come può essere? Era un file di grandi dimensioni su un piccolo dispositivo, quindi è stato un lungo processo. Si prega di testare le soluzioni durante la pubblicazione :(
m3nda

@ erm3nda Non ci hai mai detto che devi evitare di creare un file temporaneo! Si prega di vedere la seconda variante!
Adrian Panasiuk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.