Câu trả lời khác là chính xác: bạn không thể cập nhật đúng cách một kho lưu trữ tar đã nén mà không giải nén nó. Tài liệu tar của GNU gợi ý về nó và cố gắng cập nhật thất bại với thông báo lỗi rõ ràng:
$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now
Tuy nhiên, nếu bạn quan tâm đến một giải pháp sắp xếp công việc bẩn thỉu không cần giải nén, tôi có thể cung cấp một giải pháp, dựa trên các quan sát sau:
- Việc thêm các luồng bzip2 bằng cách sử dụng
cat
được hỗ trợ và tạo ra một luồng bzip2 hợp lệ (điều này cũng đúng với gzip);
- nối thêm các
cat
tệp sử dụng không tạo ra tệp tar hợp lệ, đó là lý do tại sao --concatenate
tùy chọn tồn tại, nhưng chúng ta có thể yêu cầu tar giả vờ hợp lệ:
Nó có vẻ trực quan hơn đối với bạn muốn hoặc cố gắng sử dụng con mèo để ghép hai tài liệu lưu trữ thay vì sử dụng --concatenate
thao tác; xét cho cùng, cat là tiện ích để kết hợp các tập tin.
Tuy nhiên, tài liệu lưu trữ tar kết hợp với điểm đánh dấu cuối tập tin phải được loại bỏ nếu tài liệu lưu trữ được nối phải được đọc đúng như một kho lưu trữ. --concatenate
xóa điểm đánh dấu kết thúc lưu trữ khỏi kho lưu trữ đích trước khi mỗi kho lưu trữ mới được thêm vào. Nếu bạn sử dụng mèo để kết hợp các tài liệu lưu trữ, kết quả sẽ không phải là một kho lưu trữ định dạng tar hợp lệ. Nếu bạn cần truy xuất các tệp từ kho lưu trữ đã được thêm vào bằng cách sử dụng tiện ích con mèo, hãy sử dụng tùy chọn --ignore-zeros
( -i
).
Dựa trên kiến thức này, chúng ta có thể làm, ví dụ:
cat {one,two}.tar.bz2 >combined.tar.bz2
Kết quả này, như đoạn trích tài liệu ở trên giải thích, trong một tệp tar không hợp lệ, nhưng bằng cách sử dụng --ignore-zeros
, nó vẫn có thể được đọc đầy đủ:
## Show contents of `one.tar.bz2'
$ tar tf one.tar.bz2
a
b
## Show contents of `two.tar.bz2'
$ tar tf two.tar.bz2
c
## Show contents of `combined.tar.bz2', bypassing the bad format
$ tar tif combined.tar.bz2
a
b
c
Lưu ý cách trên liệt kê tất cả ba tệp từ hai lưu trữ gốc, trong khi bỏ qua -i
(chính xác) chỉ liệt kê các tệp từ kho lưu trữ gốc đầu tiên:
$ tar tf combined.tar.bz2
a
b
Một lần nữa, đó không phải là một mánh khóe bẩn thỉu, nhưng nó có thể hữu ích nếu bạn kiểm soát cả hai mặt viết và đọc và có thể đảm bảo rằng nó -i
sẽ được sử dụng khi cố gắng đọc từ các tệp được tạo theo cách này.