Tạo một kho lưu trữ tar chia thành các khối có kích thước tối đa


83

Tôi cần sao lưu một thư mục khá lớn, nhưng tôi bị giới hạn bởi kích thước của các tệp riêng lẻ. Về cơ bản, tôi muốn tạo một tar.(gz|bz2)kho lưu trữ được chia thành 200 MB lưu trữ tối đa. Clonezilla làm một cái gì đó tương tự như thế này bằng cách chia các bản sao lưu hình ảnh có tên như vậy:

sda1.backup.tar.gz.aa
sda1.backup.tar.gz.ab
sda1.backup.tar.gz.ac

Có cách nào tôi có thể làm điều này trong một lệnh không? Tôi hiểu cách sử dụng splitlệnh, nhưng tôi không muốn phải tạo một kho lưu trữ khổng lồ, sau đó chia nó thành các kho lưu trữ nhỏ hơn, vì điều này sẽ nhân đôi không gian đĩa tôi cần để tạo lưu trữ ban đầu.


Câu trả lời:


108

Bạn có thể chuyển tar sang lệnh split:

tar cvzf - dir/ | split --bytes=200MB - sda1.backup.tar.gz.

Trên một số hệ thống * nix (như OS X), bạn có thể gặp lỗi sau:

split: illegal option -- -

Trong trường hợp đó hãy thử điều này (lưu ý -b 200m):

tar cvzf - dir/ | split -b 200m - sda1.backup.tar.gz.

Nếu bạn đang cố gắng tách tệp để vừa với ổ đĩa được định dạng FAT32, hãy sử dụng giới hạn byte là 4294967295. Ví dụ:

tar cvzf - /Applications/Install\ macOS\ Sierra.app/ | \
split -b 4294967295 - /Volumes/UNTITLED/install_macos_sierra.tgz.

3
Tuyệt quá! Làm thế nào tôi có thể giải nén kho lưu trữ?
Naftuli Kay

24
Sẽ cat sda1.backup.tar.gz.* | tar xzvf -làm việc?
Naftuli Kay

3
Vâng, nó nên. splittheo mặc định, đặt tên cho các tệp để khi được sắp xếp theo LOCALE (được thực hiện bởi shell globalbing) sẽ theo đúng thứ tự.
jordanm

4
Không có verbose, chỉ cần làm tar czf ...mà không có vvà hợp nhất bởi cat backup.tar.gz.* | tar tar xzf - không có v. Tôi thấy không có lợi ích của đầu ra dài dòng ở đây bởi v.
Léo Léopold Hertz

1
Chỉ cần giúp đỡ một người bạn bằng cách đóng gói Xcode vào ổ đĩa flash có định dạng FAT32 với: tar cvzf - Xcode.app/ | split -b 2000m - /Volumes/PH/xcode/xcode.tgz(được sử dụng từ cd /Applications/) Cảm ơn bạn rất nhiều :)
ecth

13

Trên macOS, splitlệnh hoạt động hơi khác:

$ tar cvzf - foo | split -b 2500m - foo.tgz.

4

Chỉ cần thêm: Vì kích thước tệp tối đa được phép trong vfat / fat32 là 2 ^ 32 trừ 1 (4294967295 byte), lệnh tách với kích thước tệp tối đa được phép trên hệ thống tệp đó là:

split -b4294967295 -d my_input_file my_output_file_splitted

3
serega@serega-sv:~$ tar -c  -M --tape-length=1024 --file /tmp/pseudo-tape.tar --new-volume-script=/tmp/new-volume.sh --volno-file=/tmp/volno /tmp/stuff-to-archive 
tar: Removing leading `/' from member names
moving /tmp/pseudo-tape.tar to /tmp/archive.1
moving /tmp/pseudo-tape.tar to /tmp/archive.2
moving /tmp/pseudo-tape.tar to /tmp/archive.3

Bạn sẽ cần một tập lệnh để tự động chuyển tập tin pseudo-ice.tar sang một tên mới:

serega@serega-sv:~$ cat /tmp/new-volume.sh 
dir="/tmp"
base_name="pseudo-tape.tar"
next_volume_name=`echo -n "archive."; cat $dir/volno`
echo "moving $dir/$base_name to $dir/$next_volume_name"
mv "$dir/$base_name" "$dir/$next_volume_name"

Tôi đã không đánh giá thấp câu trả lời của bạn, bởi vì tôi rất vui khi thấy một câu sử dụng -M --tape-length. Tuy nhiên, câu trả lời này không bỏ qua yêu cầu của OP về giải pháp sử dụng nén gzip hoặc bzip2.
sampablokuper 15/03/18

Thận trọng: bạn không nói về tarmà là về một bản sao tar được gọi là gtar(GNU tar). Bản sao tar này hỗ trợ để tạo tài liệu lưu trữ nhiều tập nhưng với xác suất đáng chú ý là không thể / không muốn trích xuất từ ​​các tài liệu lưu trữ đa tập đó vì nó tuyên bố không chính xác rằng phần tiếp theo không phải là phần tiếp theo đúng.
schily
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.