2009-07-13 24 views
120

Tôi cần nén một tệp lớn có dung lượng khoảng 17-20 GB. Tôi cần phải chia nó thành nhiều tệp khoảng 1GB cho mỗi tệp.Tách tệp bằng tar, gz, zip hoặc bzip2

Tôi đã tìm kiếm giải pháp qua Google và tìm cách sử dụng các lệnh splitcat. Nhưng họ không làm việc cho các tập tin lớn cả. Ngoài ra, chúng sẽ không hoạt động trong Windows; Tôi cần phải giải nén nó trên một máy Windows.

+2

Tôi cảm thấy nỗi đau của bạn nhưng điều này dường như không liên quan đến lập trình. –

+1

Nhiều chương trình nén (ví dụ như 7-Zip) có thể chia tệp nén thành các ổ đĩa có kích thước được chỉ định để phân phối dễ dàng hơn. –

+0

Điều này thuộc về superuser.com, nhưng phiên bản beta riêng tư không bắt đầu cho đến ngày mai, tôi được thông báo. – JesperE

Trả lời

5

đang Tested, ban đầu tạo ra một tập tin lưu trữ duy nhất, sau đó chia nó:

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 

Phiên bản này bỏ qua việc tạo ra một tập tin lưu trữ duy nhất và đi thẳng để tạo phần:

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

Trong phiên bản này , nếu kích thước tệp của kho lưu trữ là chia hết cho $CHUNKSIZE, thì tệp một phần cuối cùng sẽ có kích thước tệp là 0 byte.

+1

Đó là những gì 'split' đã làm. – ephemient

+0

OP cho biết chia tách không hoạt động. –

+1

ephemient Hey, tôi đã đào một số bài tìm kiếm chỉ cho điều đó. Tôi không có lệnh tách hoặc mã zip/mã nhị phân trên một thiết bị nào đó, và điều này đã hoạt động hoàn hảo. Tôi sẽ chuẩn bị mã này để làm việc như lệnh split :). Cảm ơn bạn nhiều @Adrian Panasiuk. Đó là pefect cho tôi. – erm3nda

23

Nếu bạn đang tách khỏi Linux, bạn vẫn có thể tập hợp lại trong Windows.

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

Bạn cũng có thể sử dụng 'copy/bf ile * filetogether' - http://support.microsoft.com/kb/71161 – eug

+5

Chỉ hoạt động đúng trên NTFS và nếu các tệp có trong thứ tự sắp xếp NTFS. Hãy thử nó trên FAT hoặc FAT32 = bùng nổ. – Joshua

+0

+1 đảm bảo tệp đúng thứ tự! – Brian

8

sử dụng tar để split into multiple archives

có rất nhiều chương trình mà sẽ làm việc với các tập tin tar trên cửa sổ, bao gồm Cygwin.

229

Bạn có thể sử dụng lệnh split với các tùy chọn -b:

split -b 1024m file.tar.gz 

Nó có thể được tập hợp lại trên một máy tính Windows sử dụng @Joshua 's câu trả lời.

copy /b file1 + file2 + file3 + file4 filetogether 

Sửa: Như @Charlie nêu trong bình luận dưới đây, bạn có thể muốn thiết lập một tiền tố một cách rõ ràng bởi vì nó sẽ sử dụng x khác, mà có thể gây nhầm lẫn.

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

Sửa: Việc chỉnh sửa bài vì câu hỏi được đóng lại và các giải pháp hiệu quả nhất là rất gần với nội dung của câu trả lời này:

# 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 

Giải pháp này tránh được nhu cầu sử dụng một tập tin lớn trung gian khi (de) nén. Sử dụng tùy chọn tar -C để sử dụng một thư mục khác cho các tệp kết quả. btw nếu lưu trữ bao gồm từ chỉ một tập tin duy nhất, tar có thể tránh được và chỉ gzip sử dụng:

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

Đối với các cửa sổ, bạn có thể tải về các phiên bản được chuyển của các lệnh tương tự hoặc sử dụng Cygwin.

+6

nếu bạn không thêm tiền tố làm đối số cuối cùng sau tên tệp để tách, bạn nhận được kết quả đầu ra trong các tệp có tên xaa, xab, xac, xad .... – Charlie

+0

@Charlie, cảm ơn, tôi đã cập nhật câu trả lời của mình. – matpie

+2

Thực tế việc sử dụng '-b 1024MiB' đã gây ra lỗi rằng đó là số byte không hợp lệ. Sử dụng '--bytes = 1024m' hoạt động. – Brian

Các vấn đề liên quan