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 cat
hai 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.xz
sẽ 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-zeros
tù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 tar
cũng hỗ trợ một --concatenate
chế độ để 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 xz
là cách tar
nén đầu ra của nó.
Nếu tài liệu lưu trữ chỉ hoạt động với một tar
triể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ữ r
là 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 cat
phiê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.xz
chứa nhiều db-*.tar
tệp (không nén) .