Membagi file menggunakan tar, gz, zip, atau bzip2 [ditutup]

144

Saya perlu mengompres file besar sekitar 17-20 GB. Saya perlu membaginya menjadi beberapa file sekitar 1GB per file.

Saya mencari solusi melalui Google dan menemukan cara menggunakan splitdan catperintah. Tetapi mereka tidak bekerja untuk file besar sama sekali. Juga, mereka tidak akan bekerja di Windows; Saya perlu mengekstraknya di mesin Windows.

Aka
sumber
3
Saya merasakan sakit Anda tetapi ini tampaknya tidak terkait pemrograman.
Jason S
1
Banyak program kompresi (misalnya 7-Zip) dapat membagi file terkompresi menjadi volume dengan ukuran yang ditentukan untuk distribusi yang lebih mudah.
Martin Liversage
Ini milik superuser.com, tetapi beta pribadi tidak dimulai sampai besok, saya diberitahu.
JesperE
Bolehkah saya bertanya mengapa Anda perlu file itu dikompresi?
Jan Jungnickel
Jika salah satu dari dua solusi yang diposting di sini tidak berjalan dengan baik, ia akan membutuhkan solusi pemrograman.
Joshua

Jawaban:

253

Anda dapat menggunakan splitperintah dengan -bopsi:

split -b 1024m file.tar.gz

Itu dapat dipasang kembali pada mesin Windows menggunakan jawaban @ Joshua .

copy /b file1 + file2 + file3 + file4 filetogether

Sunting : Seperti yang dinyatakan @Charlie dalam komentar di bawah, Anda mungkin ingin menetapkan awalan secara eksplisit karena akan menggunakan xsebaliknya, yang dapat membingungkan.

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, ...

Sunting : Mengedit kiriman karena pertanyaan ditutup dan solusi paling efektif sangat dekat dengan konten jawaban ini:

# 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

Solusi ini menghindari kebutuhan untuk menggunakan file besar menengah ketika (de) mengompresi. Gunakan opsi tar -C untuk menggunakan direktori berbeda untuk file yang dihasilkan. btw jika arsip hanya terdiri dari satu file, tar dapat dihindari dan hanya gzip yang digunakan:

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

Untuk windows Anda dapat mengunduh versi porting dari perintah yang sama atau menggunakan cygwin.

matpie
sumber
7
jika Anda tidak menambahkan awalan sebagai argumen terakhir setelah nama file untuk membagi Anda mendapatkan output dalam file bernama XAA, Xab, xac, XAD ....
Charlie
@ Charlie, terima kasih, saya memperbarui jawaban saya.
Matpie
2
Sebenarnya menggunakan -b 1024MiBmemberi kesalahan bahwa itu adalah jumlah byte yang tidak valid. Menggunakan --bytes=1024mkarya.
Brian
Dan Anda tidak perlu menggunakan catuntuk memasang kembali file. Anda dapat menggunakan copy /b file1 + file2 + etc..Windows, kemudian menyalin kembali ke Linux dan tar dapat membaca tarball yang dipasang kembali. Saya baru saja mencobanya.
Brian
1
Split memiliki opsi --numeric-suffixes: gunakan sufiks numerik alih-alih alfabet.
Dr. Jan-Philip Gehrcke
27

Jika Anda terpisah dari Linux, Anda masih dapat memasang kembali di Windows.

copy /b file1 + file2 + file3 + file4 filetogether
Joshua
sumber
Anda juga dapat menggunakan copy /b file* filetogether- support.microsoft.com/kb/71161
eug
5
Itu bekerja dengan benar hanya pada NTFS dan jika file sudah dalam urutan sortir NTFS. Cobalah FAT atau FAT32 = boom.
Joshua
+1 memastikan file dalam urutan yang benar!
Brian
@ Yosua Agar adil, jika tidak, Anda telah melakukan penamaan pekerjaan yang buruk.
jpmc26
@ jpmc26: Anda tahu tentang kebiasaan buruk penataan ulang direktori FAT32 kan?
Joshua
8

Kode yang diuji, awalnya membuat file arsip tunggal, lalu membaginya:

 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

Varian ini menghilangkan pembuatan file arsip tunggal dan langsung membuat bagian:

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; )

Dalam varian ini, jika ukuran file arsip dapat dibagi dengan $CHUNKSIZE, maka file parsial terakhir akan memiliki ukuran file 0 byte.

Adrian Panasiuk
sumber
1
Itu sudah apa split.
ephemient
1
ephemient Hei, saya telah menggali beberapa posting hanya mencari YANG. Saya tidak memiliki perintah split atau zip / binari pada perangkat tertentu, dan ini berfungsi dengan baik. Saya akan menyiapkan kode ini untuk berfungsi sebagai perintah split :). Terima kasih banyak @Adrian Panasiuk. Itu sempurna bagi saya.
m3nda
@ erm3nda Sama-sama, senang bisa membantu!
Adrian Panasiuk
Tapi, saya sudah menguji dan hasilnya adalah file lengkap, tidak terpecah. Bagaimana bisa? Adalah file besar di perangkat kecil, jadi itu proses yang panjang. Silakan uji solusi Anda saat memposting :(
m3nda
@ erm3nda Anda tidak pernah memberi tahu kami bahwa Anda harus menghindari membuat file sementara! Silakan lihat varian kedua!
Adrian Panasiuk