hãy để tar tự động phát hiện kiểu nén khi giải nén từ stdin


16

Tôi sử dụng GNU tar. Nó có thể tự động phát hiện loại nén khi nén / giải nén tập tin. Nhưng tôi cần giải nén một kho lưu trữ từ stdin và loại nén không xác định. Tôi nhận thấy rằng tar có thể cho tôi gợi ý chính xác như:

tar: Archive is compressed. Use -z option

Nhưng tôi muốn tar sử dụng tùy chọn nén đó tự động mà không yêu cầu tôi nhập đối số đó. Làm thế nào tôi có thể làm điều đó? Tại sao tar không giải nén vì nó đã biết kiểu nén?

Cảm ơn bạn!


Nó không khó để phát triển, nhưng nó không được thực hiện cho đến bây giờ.
peterh - Phục hồi Monica

3
Lý do nó không thể làm điều này là vì tarkhông biết nó thuộc loại dữ liệu nào stdincho đến khi nó đọc nó, và sau đó là quá muộn để gọi chương trình giải nén. Nó hỗ trợ gzip, bzip2 và những thứ khác. Làm việc xung quanh vấn đề này không dễ dàng (nó sẽ phải đệm dữ liệu), vì vậy nó chỉ cho bạn thử lại.
Kevin Panko

@KevinPanko Tại sao quá muộn? Không, vẫn chưa muộn. Anh ta đọc 4K 4K đầu tiên trong bộ đệm, kiểm tra kiểu nén của nó (nếu có), sau đó gọi chương trình. Bộ đệm này là 10-20 dòng mã C bổ sung.
peterh - Phục hồi Monica

2
Tại thời điểm đó khi nó biết dữ liệu nào có, nó không còn có thể sử dụng một phương thức fork()/ đơn giản exec()để dẫn dữ liệu thông qua một tiện ích giải nén. Tiện ích sẽ đọc từ stdinđường ống và 4K đầu tiên sẽ bị thiếu. Không có cách nào để đưa dữ liệu trở lại vào đường ống sau khi đọc nó.
Kevin Panko

3
@KevinPanko: Nó có thể được thực hiện bằng cách bỏ qua hai quy trình, tuy nhiên, về cơ bản thực hiện tương đương cat buffer - | gunzip. (Ngoài ra, I / O không chặn có thể được sử dụng để tránh sự cần thiết của quy trình bổ sung.)
Ilmari Karonen 17/12/13

Câu trả lời:


10

Đây không phải là câu trả lời bạn muốn nghe, nhưng điều này không được GNU tar hỗ trợ theo hướng dẫn của nó:

Trường hợp duy nhất khi bạn phải chỉ định tùy chọn giải nén trong khi đọc tệp lưu trữ là khi đọc từ một đường ống hoặc từ một ổ đĩa băng không hỗ trợ truy cập ngẫu nhiên. Tuy nhiên, trong trường hợp này, GNU tar sẽ cho biết bạn nên sử dụng tùy chọn nào. Ví dụ:

$ cat archive.tar.gz | tar tf -
tar: Archive is compressed.  Use -z option
tar: Error is not recoverable: exiting now

Nếu bạn thấy chẩn đoán như vậy, chỉ cần thêm tùy chọn được đề xuất vào lệnh gọi GNU tar:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 Tạo và đọc tài liệu lưu trữ nén


2
Lưu ý điều này hoạt động trong lệnh tar trên OSX nhưng không phải trên Linux khi sử dụng GNU tar. Vì vậy, điều này có thể được sửa chữa.
Sean Perry

8

Cuối cùng, tôi nhận ra lý do tôi không thể để tar phát hiện và giải nén tệp lưu trữ từ stdin là tôi sử dụng GNU tar. BSD tar có thể làm điều đó tự động mà không có vấn đề. Vì vậy, bây giờ tôi quyết định sử dụng bsdtar thay vì tar trong kịch bản của mình.

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.