Làm cách nào để kết hợp nhiều tệp nén vào một tệp lưu trữ?


10

Tôi có một vài trăm .tar.xztệp gần như giống hệt nhau (chúng là các cơ sở dữ liệu hàng ngày và cơ sở dữ liệu thay đổi chậm).

Tôi tin rằng do sự tương đồng trong các tệp không nén, chúng sẽ nén rất tốt và các thử nghiệm quy mô nhỏ đã chỉ ra rằng nén bất kỳ số lượng các tệp không nén này sẽ tạo ra một kho lưu trữ chỉ lớn hơn một trong số chúng.

Vấn đề của tôi là tất cả các tệp không nén sẽ là một vài terabyte (tỷ lệ nén là khoảng 25: 1) và tôi không có nhiều dung lượng đĩa để sử dụng làm vùng làm việc.

Có cách nào để tôi có thể xử lý từng tệp nén một lần, thêm chúng vào một kho lưu trữ duy nhất và giữ lại lợi ích của việc nén chúng lại với nhau không?


Bạn đã thử kịch bản nó, để bạn giải nén một tệp, thêm tất cả các tệp vào một kho lưu trữ nhất định và sau đó chuyển sang tệp tiếp theo?
darnir

Câu trả lời:


10

Vì các tệp tar là một định dạng phát trực tuyến - bạn có thể kết hợp cathai tệp với nhau và nhận được kết quả gần như chính xác - bạn hoàn toàn không cần phải trích xuất chúng vào đĩa để thực hiện việc này. Bạn có thể giải nén (chỉ) các tệp, ghép chúng lại với nhau và giải nén luồng đó:

xzcat *.tar.xz | xz -c > combined.tar.xz

combined.tar.xzsẽ là một tarball nén của tất cả các tệp trong tarball thành phần chỉ bị hỏng nhẹ. Để trích xuất, bạn sẽ phải sử dụng --ignore-zerostùy chọn (trong GNU tar), vì các tài liệu lưu trữ có một điểm đánh dấu "cuối tập tin" sẽ xuất hiện ở giữa kết quả. Mặc dù vậy, mọi thứ sẽ hoạt động chính xác.

GNU tarcũng hỗ trợ một --concatenatechế độ để sản xuất tài liệu lưu trữ kết hợp. Điều đó có những hạn chế tương tự như trên - bạn phải sử dụng --ignore-zerosđể giải nén - nhưng nó không hoạt động với kho lưu trữ nén. Bạn có thể xây dựng một cái gì đó để lừa nó hoạt động bằng cách sử dụng thay thế quy trình, nhưng nó rắc rối và thậm chí còn dễ vỡ hơn.

Nếu có các tệp xuất hiện nhiều lần trong các tệp tar khác nhau, thì tệp này sẽ không hoạt động chính xác, nhưng bạn đã gặp phải vấn đề đó. Nếu không, điều này sẽ cung cấp cho bạn những gì bạn muốn - đường ống đầu ra thông qua xzlà cách tarnén đầu ra của nó.


Nếu tài liệu lưu trữ chỉ hoạt động với một tartriển khai cụ thể không phù hợp với mục đích của bạn, thì việc thêm vào kho lưu trữ rlà bạn của bạn:

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    mkdir tmp
    pushd tmp
    tar xJf "../$x"
    tar rJf ../combined.tar.xz .
    popd
    rm -r tmp
done

Điều này chỉ bao giờ trích xuất một kho lưu trữ tại một thời điểm, vì vậy không gian làm việc bị giới hạn ở kích thước của nội dung của một kho lưu trữ. Quá trình nén được truyền phát giống như bạn đã thực hiện lưu trữ cuối cùng cùng một lúc, vì vậy nó sẽ tốt hơn bao giờ hết. Bạn thực hiện rất nhiều giải nén và giải nén quá mức sẽ làm cho việc này chậm hơn các catphiên bản, nhưng kho lưu trữ kết quả sẽ hoạt động ở bất cứ đâu mà không cần bất kỳ sự hỗ trợ đặc biệt nào.

Lưu ý rằng - tùy thuộc vào chính xác những gì bạn muốn - chỉ cần thêm các tệp tar không nén vào một kho lưu trữ có thể đủ. Họ sẽ nén (gần như) chính xác cũng như nội dung của họ trong một tệp và điều này sẽ giảm chi phí nén cho mỗi tệp. Điều này sẽ trông giống như:

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    xz -dk "$x"
    tar rJf combined.tar.xz "${x%.xz}"
    rm -f "${x%.xz}"
done

Điều này hơi kém hiệu quả về kích thước nén cuối cùng vì có thêm các tiêu đề tar trong luồng, nhưng tiết kiệm thời gian trích xuất và thêm lại tất cả các tệp dưới dạng tệp. Bạn sẽ kết thúc với việc combined.tar.xzchứa nhiều db-*.tartệp (không nén) .


Cảm ơn, tùy chọn thứ hai của bạn có vẻ phù hợp với mục đích của tôi, nhưng bạn có thể giải thích về đoạn cuối của bạn không? Điều này sẽ trông như thế nào?
jl6

@ jl6: Xem chỉnh sửa.
Michael Homer

Xin lỗi, chỉ có thể kiểm tra này. Phương pháp thứ hai của bạn cho tôi lỗi này:tar: Cannot update compressed archives
jl6
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.