2009-07-13 8 views
120

muszę kompresji dużych plików około 17-20 GB. Muszę podzielić go na kilka plików o wielkości około 1 GB na plik.dzielenia plików za pomocą tar, gz, ZIP lub bzip2

Szukałem rozwiązania za pośrednictwem Google i znalazłem sposoby, używając poleceń split i cat. Ale w ogóle nie działały dla dużych plików. Ponadto nie będą działać w systemie Windows; Muszę wyodrębnić go na komputerze z systemem Windows.

+2

czuję ból, ale to nie wydaje się być związany programowania. –

+1

Wiele programów do kompresji (np. 7-Zip) jest w stanie podzielić skompresowany plik na woluminy o określonym rozmiarze w celu łatwiejszej dystrybucji. –

+0

To należy na superuser.com, ale prywatny beta nie rozpocznie się dopiero jutro, jak mi powiedziano. – JesperE

Odpowiedz

5

Testowany kod, początkowo tworzy pojedynczy plik archiwum, a następnie dzieli go:

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 

Wariant ten pomija tworzenie pojedynczego pliku archiwum i idzie prosto do tworzenia części:

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

W tym wariancie jeśli rozmiar pliku archiwum jest podzielna przez $CHUNKSIZE, to ostatni plik częściowe będą miały rozmiar pliku 0 bajtów.

+1

To właśnie robi "split". – ephemient

+0

OP mówi, że podział nie działa. –

+1

efhemient Hej, wykopałem jakiś post, szukając właśnie tego. Nie mam żadnych poleceń ani plików binarnych z podziałem na pliki ZIP, a ten działał idealnie. Przygotuję ten kod do pracy jako polecenie split :). Dziękuję bardzo @Adrian Panasiuk. To dla mnie perfekcyjne. – erm3nda

23

Jeśli dzieląc z Linuksa, nadal można zamontować w systemie Windows.

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

Możesz także użyć 'copy/bf ile * filetogether' - http://support.microsoft.com/kb/71161 – eug

+5

Działa to poprawnie tylko w NTFS i jeśli pliki są już w porządku sortowania NTFS. Wypróbuj go na FAT lub FAT32 = bum. – Joshua

+0

+1 upewnij się, że pliki są we właściwej kolejności! – Brian

8

użycie smoły do ​​split into multiple archives

istnieje wiele programów, które będą pracować z plikami w systemie Windows, smoły oraz Cygwin.

229

Można użyć komendy split z opcją -b:

split -b 1024m file.tar.gz 

To może być ponownie zamontowany w komputerze z systemem Windows przy użyciu @Joshua „s odpowiedź.

copy /b file1 + file2 + file3 + file4 filetogether 

Edit: Jak @Charlie podano w komentarzu poniżej, może chcesz ustawić prefiks wyraźnie, ponieważ będzie używać x inaczej, co może być mylące.

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: Edycja posta bo pytanie jest zamknięta i najbardziej skutecznym rozwiązaniem jest bardzo blisko do treści tej odpowiedzi:

# 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 

Takie rozwiązanie eliminuje konieczność korzystania pośredni duży plik podczas kompresji (de). Użyj opcji tar - aby użyć innego katalogu dla plików wynikowych. btw, jeśli archiwum składa się tylko z jednego pliku tar można uniknąć, a jedynie wykorzystywane gzip:

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

Do okien można pobrać portowanych wersje tych samych poleceń lub użyć Cygwin.

+6

jeśli nie dodasz prefiksu jako ostatniego argumentu po nazwie pliku do podziału, otrzymasz dane wyjściowe w plikach o nazwach xaa, xab, xac, xad .... – Charlie

+0

@ Charlie, dzięki, zaktualizowałem swoją odpowiedź. – matpie

+2

Faktycznie użycie '-b 1024MiB' spowodowało błąd, który był nieprawidłową liczbą bajtów. Używanie '--bytes = 1024m' działa. – Brian