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.