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.