2009-07-13 16 views
120

Ho bisogno di comprimere un file di grandi dimensioni di circa 17-20 GB. Ho bisogno di dividerlo in diversi file di circa 1 GB per file.Split file usando tar, gz, zip o bzip2

Ho cercato una soluzione tramite Google e ho trovato i modi utilizzando i comandi split e cat. Ma non hanno funzionato per i file di grandi dimensioni. Inoltre, non funzioneranno in Windows; Ho bisogno di estrarlo su una macchina Windows.

+2

Sento il tuo dolore ma questo non sembra essere correlato alla programmazione. –

+1

Molti programmi di compressione (ad esempio 7-Zip) sono in grado di dividere il file compresso in volumi di una dimensione specificata per una distribuzione più semplice. –

+0

Questo appartiene a superuser.com, ma la beta privata non verrà avviata prima di domani, mi è stato detto. – JesperE

risposta

5

codice testato, inizialmente crea un unico file di archivio, quindi 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 unico file di archivio e va dritto al parti che creano:

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à la dimensione del file 0 byte.

+1

Questo è ciò che 'split' fa già. – ephemient

+0

OP dice che split non ha funzionato. –

+1

Efemici Ehi, ho scavato qualche post cercando solo PER QUELLO. Non ho né split né comandi zip/binari su un determinato dispositivo, e questo ha funzionato perfettamente. Preparerò questo codice per funzionare come comando split :). Grazie mille @Adrian Panasiuk. È perfetto per me. – erm3nda

23

Se si sta dividendo da Linux, è ancora possibile riassemblare in Windows.

copy /b file1 + file2 + file3 + file4 filetogether 
+0

Puoi anche usare 'copia/bf ile * filetogether' - http://support.microsoft.com/kb/71161 – eug

+5

Che funziona correttamente solo su NTFS e se i file sono già in ordine di ordinamento NTFS. Provalo su FAT o FAT32 = boom. – Joshua

+0

+1 assicurati che i file siano nel giusto ordine! – Brian

229

È possibile utilizzare il comando split con l'opzione -b:

split -b 1024m file.tar.gz 

Può essere riassemblato su una macchina Windows utilizzando @Joshua 's risposta.

copy /b file1 + file2 + file3 + file4 filetogether 

Edit: Come @Charlie indicato nel commento qui sotto, si potrebbe desiderare di impostare un prefisso in modo esplicito perché userà x in caso contrario, 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, ... 

Edit: Modifica del post perché domanda è chiusa e la soluzione più efficace è molto vicino 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. btw, se l'archivio è composto da un solo file, tar potrebbe essere evitato e solo gzip utilizzato:

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

Per le finestre è possibile scaricare le versioni porting degli stessi comandi o l'uso Cygwin.

+6

se non si aggiunge un prefisso come ultimo argomento dopo il nome del file di dividere ottenere output in file denominati xaa, xab, XAC, xad .... – Charlie

+0

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

+2

In realtà l'uso di '-b 1024MiB' ha dato un errore che era un numero non valido di byte. L'uso di '--bytes = 1024m' funziona. – Brian