Làm thế nào để tạo kho lưu trữ tar chia thành nhiều giai đoạn để tiết kiệm dung lượng?
Tôi có một thư mục rất lớn mà tôi đang cố gắng tạo một kho lưu trữ tar. Vấn đề là tôi không có đủ dung lượng trống để lưu trữ toàn bộ kho lưu trữ, vì vậy tôi muốn tạo các phần lưu trữ có dung lượng 100-200GB tại một thời điểm và chuyển từng phần đó sang lưu trữ đám mây. Tôi cần có khả năng kiểm soát khi nào các phần mới được tạo để ổ cứng của tôi không bị đầy nhưng tất cả các lệnh tôi đã tìm thấy để tạo các tarball phân tách luôn tạo tất cả cùng một lúc, trong cùng một thư mục.
Giải pháp gần nhất mà tôi tìm thấy là từ câu hỏi này nhưng tất cả các câu trả lời đều căn cứ vào số lượng tệp chứ không phải kích thước, điều quan trọng đối với trường hợp sử dụng của tôi vì kích thước tệp của tôi được phân phối không đồng đều.
Trả lời
Bạn có thể sử dụng tar
, với các tùy chọn sau:
--new-volume-script=COMMAND
--tape-length=N
Ở cuối mỗi tập, nó sẽ gọi tập lệnh của bạn, sẽ có một số biến môi trường để biết tập nào vừa được xử lý. Kiểm tra trang hướng dẫn để biết danh sách đầy đủ, nhưng ít nhất biến TAR_VOLUME khá hữu ích, trong trường hợp bạn phải đổi tên tệp đầu ra hoặc theo dõi bằng cách nào đó của ổ đĩa hiện tại:
TAR_VOLUME Số thứ tự của tập tin tar đang xử lý (được đặt nếu đọc một kho lưu trữ nhiều tập).
Nếu trả về tập lệnh 0
tar
sẽ tiếp tục, nếu không nó sẽ dừng lại.
Ví dụ: điều này sẽ tạo từng tập, với kích thước tối đa là 20M, gọi tập lệnh của bạn mỗi khi đạt đến giới hạn:
tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=/path/to/myscript.sh --tape-length=20M
Tập lệnh có thể đơn giản echo "Next volume";read
hoặc bạn thậm chí có thể thực hiện chuyển từ nó (đổi tên tập, vì khi bạn thoát ra /tmp/volume.tar
sẽ bị ghi đè).
Ở phía bên kia, hãy chắc chắn sử dụng cờ - nhiều tập. Nếu bạn không, tar sẽ dừng lại với các lỗi (tôi để lại nó trong trường hợp ai đó tìm kiếm lỗi):
tar: EOF không mong muốn trong kho lưu trữ
tar: Lỗi không thể khôi phục được: thoát ngay bây giờ
tar xvf /path/to/transferred.volume --multi-volume
Chuẩn bị tập số 2 cho /path/to/transferred.volume và nhấn return:
tar
sẽ nhắc bạn cho tập mới. Sau khi bạn nhấn enter /path/to/transferred.volume
sẽ được mở lại, v.v.
Tiếp theo câu trả lời tuyệt vời của eduardo-trápani , dưới đây là phiên bản sửa đổi một chút của tập lệnh được tìm thấy trên Trang GNU , chờ người dùng nhập cho mỗi tập và thử lại nếu không tìm thấy tập:
Để hoàn thiện, đây là lệnh được sử dụng để tạo kho lưu trữ:
tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=./myscript.sh --tape-length=1000M
Và đây là lệnh tôi đã sử dụng để giải nén kho lưu trữ được chia nhỏ:
tar xvf /tmp/volume.tar --multi-volume --new-volume-script=./myscript.sh
myscript.sh:
#!/bin/bash
# For this script it's advisable to use a shell, such as Bash,
# that supports a TAR_FD value greater than 9.
echo "Press enter to continue to next volume"
read
echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.
name=`expr $TAR_ARCHIVE : '\(.*\)-.*'` case $TAR_SUBCOMMAND in
-c) ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || echo "Failed to find volume" ;; *) exit 1 esac echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD
Chỉnh sửa: Điều này chỉ hoạt động với GNU Tar có thể được cài đặt trên macOS (w / Homebrew) bằng cách:
brew install gnu-tar
Để sử dụng nó làm tar mặc định, bạn sẽ cần thêm nó vào đường dẫn của mình như sau:
export PATH="$(brew --prefix)/opt/python/libexec/bin:$PATH"