Tách các tệp bằng tar, gz, zip hoặc bzip2 [đã đóng]


144

Tôi cần nén một tệp lớn khoảng 17-20 GB. Tôi cần chia nó thành nhiều tệp khoảng 1GB cho mỗi tệp.

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


3
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.
Jason S

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 khối có kích thước xác định để phân phối dễ dàng hơn.
Martin Liversage

Đ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 nói.
JesperE

Tôi có thể hỏi tại sao bạn cần nén tập tin đó không?
Jan Jungnickel

Nếu một trong hai giải pháp khả thi được đăng ở đây không được triển khai, anh ta sẽ cần một giải pháp lập trình.
Joshua

Câu trả lời:


253

Bạn có thể sử dụng splitlệnh với -btùy chọn:

split -b 1024m file.tar.gz

Nó có thể được lắp lại trên máy Windows bằng câu trả lời của @ Joshua .

copy /b file1 + file2 + file3 + file4 filetogether

Chỉnh sửa : Như @Charlie đã nêu trong nhận xét bên dưới, bạn có thể muốn đặt tiền tố một cách rõ ràng vì nó sẽ sử dụng xkhác, điều này 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, ...

Chỉnh sửa : Chỉnh sửa bài đăng vì câu hỏi đã đóng và giải pháp hiệu quả nhất 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 sự cần thiết phải sử dụng một tệp 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 kho lưu trữ chỉ bao gồm từ một tệp duy nhất, tar có thể tránh được và chỉ sử dụng gzip:

# 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 xuống các phiên bản được chuyển của cùng một lệnh hoặc sử dụng cygwin.


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

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

2
Trên thực tế, việc sử dụng -b 1024MiBđã đưa ra một lỗi rằng đó là số byte không hợp lệ. Sử dụng --bytes=1024mcông trình.
Brian

Và bạn không phải sử dụng catđể tập hợp lại tập tin. Bạn có thể sử dụng copy /b file1 + file2 + etc..trên Windows, sau đó sao chép lại vào Linux và tar có thể đọc tarball được ghép lại. Tôi chỉ thử nó.
Brian

1
Split có tùy chọn --numeric-suffixes: sử dụng hậu tố số thay vì chữ cái.
Tiến sĩ Jan-Philip Gehrcke 4/215

27

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

Bạn cũng có thể sử dụng copy /b file* filetogether- support.microsoft.com/kb/71161
eug

5
Điều đó chỉ hoạt động chính xác trên NTFS và nếu các tệp đã được sắp xếp theo thứ tự NTFS. Hãy thử nó trên FAT hoặc FAT32 = boom.
Joshua

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

@Joshua Công bằng mà nói, nếu không, bạn đã làm một công việc đặt tên kém.
jpmc26

@ jpmc26: Bạn biết về thói quen sắp xếp lại thư mục xấu của FAT32 phải không?
Joshua


8

Mã được kiểm tra, ban đầu tạo một tệp lưu trữ duy nhất, sau đó chia nhỏ 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

Biến thể này bỏ qua việc tạo một tệp lưu trữ duy nhất và đi thẳng vào việc tạo các 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 biến thể này, nếu kích thước tệp của kho lưu trữ chia hết cho $CHUNKSIZE, thì tệp một phần cuối cùng sẽ có kích thước tệp 0 byte.


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

1
phù du Này, tôi đã đào một số bài viết chỉ tìm kiếm RATNG. Tôi không có lệnh / mã nhị phân tách cũng như mã nhị phân trên một thiết bị nhất định và thiết bị 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 chia :). Cảm ơn bạn rất nhiều @Adrian Panasiuk. Đó là điều tốt cho tôi.
m3nda

@ erm3nda Bạn hoan nghênh, rất vui vì nó giúp!
Adrian Panasiuk

Nhưng, tôi đã thử nghiệm và kết quả là một tệp đầy đủ, không bị phân tách. Làm thế nào nó có thể được? Là một tệp lớn trên một thiết bị nhỏ, quá trình dài cũng vậy. Vui lòng kiểm tra các giải pháp của bạn trong khi đăng :(
m3nda

@ erm3nda Bạn không bao giờ nói với chúng tôi rằng bạn cần tránh tạo một tệp tạm thời! Xin vui lòng xem biến thể thứ hai!
Adrian Panasiuk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.