Tar, gz, zip veya bzip2 kullanarak dosyaları bölme [kapalı]


144

Yaklaşık 17-20 GB büyük bir dosyayı sıkıştırmam gerekiyor. Dosya başına yaklaşık 1GB'lık birkaç dosyaya bölmem gerekiyor.

Google üzerinden bir çözüm aradım splitve catkomutları kullanarak yollar buldum . Ancak büyük dosyalar için hiç çalışmadılar. Ayrıca, Windows'da çalışmazlar; Bir Windows makinesinde çıkarmam gerekiyor.


3
Acını hissediyorum ama bu programlama ile ilgili görünmüyor.
Jason S

1
Birçok sıkıştırma programı (örneğin 7-Zip gibi), daha kolay dağıtım için sıkıştırılmış dosyayı belirtilen boyutta bölmelere ayırabilir.
Martin Liversage

Bu superuser.com'a ait, ancak özel beta'nın yarına kadar başlamaması söylendi.
JesperE

Sıkıştırılmış dosyaya neden ihtiyacınız olduğunu sorabilir miyim?
Jan Jungnickel

Burada yayınlanan iki uygulanabilir çözümden biri devre dışı kalmazsa, bir programlama çözümüne ihtiyacı olacaktır.
Joshua

Yanıtlar:


253

Sen kullanabilirsiniz splitile komutu -bseçeneği:

split -b 1024m file.tar.gz

@ Joshua'nın cevabı kullanılarak bir Windows makinesinde yeniden monte edilebilir .

copy /b file1 + file2 + file3 + file4 filetogether

Düzenleme : @Charlie aşağıdaki yorumda belirtildiği gibi, xaksi takdirde, kafa karıştırıcı olabilir kullanacağı için açıkça bir önek ayarlamak isteyebilirsiniz .

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

Düzenleme : Soru kapatıldığı ve en etkili çözüm bu cevabın içeriğine çok yakın olduğu için yazıyı düzenleme:

# 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

Bu çözüm, (de) sıkıştırırken orta büyüklükte bir dosya kullanma ihtiyacını ortadan kaldırır. Sonuçta elde edilen dosyalar için farklı bir dizin kullanmak için tar -C seçeneğini kullanın. btw arşivi yalnızca tek bir dosyadan oluşuyorsa, katran önlenebilir ve yalnızca gzip kullanılabilir:

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

Windows için aynı komutların taşınan sürümlerini indirebilir veya cygwin'i kullanabilirsiniz.


7
bölmek için dosya adından sonra son argüman olarak bir önek eklemezseniz xaa, xab, xac, xad .... adlı dosyalarda çıktı alırsınız
Charlie

@Charlie, teşekkürler, cevabımı güncelledim.
matpie

2
Aslında kullanmak -b 1024MiBgeçersiz bir bayt sayısı hatası verdi. --bytes=1024mEserleri kullanma .
Brian

Ve catdosyayı yeniden birleştirmek için kullanmak zorunda değilsiniz . copy /b file1 + file2 + etc..Windows'da kullanabilirsiniz , sonra Linux'a geri kopyalayın ve tar, yeniden birleştirilen tarball'ı okuyabilir. Sadece denedim.
Brian

1
Bölme seçeneği vardır --numeric-suffixes: alfabetik yerine sayısal sonekler kullanın.
Dr.Jan-Philip Gehrcke

27

Linux'tan ayrılıyorsanız, yine de Windows'da yeniden birleştirebilirsiniz.

copy /b file1 + file2 + file3 + file4 filetogether

Ayrıca kullanabilirsiniz copy /b file* filetogether- support.microsoft.com/kb/71161
eug

5
Bu, yalnızca NTFS'de ve dosyalar zaten NTFS sıralama düzenindeyse düzgün çalışır. FAT veya FAT32 üzerinde deneyin = bom.
Joshua

+1, dosyaların doğru sırada olduğundan emin olun!
Brian

@Joshua Adil olmak gerekirse, eğer değillerse, kötü bir iş adlandırma yaptınız.
jpmc26

@ jpmc26: FAT32'nin kötü dizin yeniden sıralama alışkanlıklarını biliyorsunuz değil mi?
Joshua


8

Test edilen kod, başlangıçta tek bir arşiv dosyası oluşturur, ardından böler:

 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

Bu varyant tek bir arşiv dosyası oluşturmayı atlar ve doğrudan parça oluşturmaya gider:

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

Bu varyantta, arşivin dosya boyutu bölünebilirse $CHUNKSIZE, son kısmi dosya 0 bayt dosya boyutuna sahip olur.


1
Bunu splitzaten yapıyor.
ephemient

1
ephemient Hey, sadece bunun için arıyorum bazı yazı kazmak var. Belli bir cihazda bölünmüş veya zip komutları / ikili dosyaları yok ve bu mükemmel bir şekilde çalıştı. Bu kodu split komut olarak çalışmak için hazırlayacağım :). Adrian Panasiuk'a çok teşekkür ederim. Bu benim için bir pefect.
m3nda

@ erm3nda Hoş geldiniz, yardımcı olduğuna sevindim!
Adrian Panasiuk

Ancak, test ettim ve sonuç tam bir dosya oldu, bölünmedi. Nasıl olabilir? Küçük bir cihazda büyük bir dosyaydı, bu yüzden uzun bir süreçti. Lütfen gönderirken çözümlerinizi test edin :(
m3nda

@ erm3nda Bize geçici bir dosya oluşturmaktan kaçınmanız gerektiğini söylemediniz! Lütfen ikinci türe bakın!
Adrian Panasiuk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.