Thêm tệp vào tệp tbz


8

Tôi đang tìm cách cập nhật hàng ngàn tệp lưu trữ .tbz, vì vậy tôi sẽ thực hiện việc này với tập lệnh shell. Tôi cần thêm một tệp cho mỗi tệp.

Câu hỏi của tôi là, có cách nào nhanh hơn để làm điều này mà không cần trích xuất từng nội dung của tbz, sau đó nén lại với tệp mới có trong tar chứa không? Các lệnh sẽ trông như thế nào?

Cảm ơn


Một thay thế rõ ràng là đặt các tệp nén vào một tarball không nén. Nhưng điều đó thay đổi định dạng dữ liệu để nó có thể không khả thi đối với bạn và nó có thể không hiệu quả đối với số lượng lớn các tệp nhỏ có dự phòng giữa chúng.
Phục hồi lại

Câu trả lời:


12

Mặc dù tarcó thể thêm tệp vào kho lưu trữ đã có sẵn nhưng nó không thể được nén. Bạn sẽ phải bunzip2lưu trữ nén, để lại một tarball tiêu chuẩn. Sau đó, bạn có thể sử dụng tarkhả năng của mình để thêm tệp vào kho lưu trữ hiện có và sau đó giải nén lại bzip2.

Từ hướng dẫn:

 -r      Like -c, but new entries are appended to the archive.  Note that this only
         works on uncompressed archives stored in regular files.  The -f option is
         required.

điều đó thực sự đúng
Kiwy

Đây là một phương thức, nhưng nó không phải là phương pháp duy nhất. Có thể sửa đổi luồng bzip2 mà không giải nén hoàn toàn. Tôi không biết liệu nó có thể thực hiện theo cách cho phép nối rõ ràng vào kho lưu trữ tar hay không, nhưng dhag cho thấy một phương thức một phần.
Gilles 'SO- ngừng trở nên xấu xa'

10

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 cattệp sử dụng không tạo ra tệp tar hợp lệ, đó là lý do tại sao --concatenatetù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 --concatenatethao 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ữ. --concatenatexó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ó -isẽ được sử dụng khi cố gắng đọc từ các tệp được tạo theo cách này.


Điều đó rất thú vị nhờ phản hồi chi tiết. Thật không may, tôi không kiểm soát được quá trình mà cuối cùng sẽ đọc những tài liệu lưu trữ này.
ChaiZero

Điều này có thể được sử dụng để "ẩn" một số tệp trong kho lưu trữ để ai đó trích xuất ngẫu nhiên sẽ chỉ nhận được nội dung của tarball gốc, nhưng những người biết thêm idòng lệnh sẽ thấy toàn bộ.
Monty Harder
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.