Xóa tệp khỏi kho lưu trữ tar


17

Tôi có một tệp lớn foo.tar.xzchứa rất nhiều (200000) tệp. Tôi phát hiện ra rằng kho lưu trữ này chứa một số (khoảng 5000) tệp tôi không muốn. Tôi không có đủ dung lượng đĩa để giải nén toàn bộ vào đĩa; Ngoài ra, tôi sợ các thuộc tính / quyền có thể bị mất nếu tôi làm như vậy. Tôi có đủ không gian để lưu trữ hai bản sao của kho lưu trữ nén . Có một công cụ để loại bỏ một số tệp khỏi kho lưu trữ (được chỉ định bằng regex trên tên tệp) khi đang di chuyển, tức là không giải nén tệp lưu trữ vào các tệp riêng lẻ không?

Câu trả lời:


14

(đã chỉnh sửa, vì tôi đã hiểu nhầm câu hỏi, từ đó cũng được chỉnh sửa)

Điều tốt nhất bạn có thể làm là trích xuất, xóa và giải nén toàn bộ tệp.

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

Không thể xóa các tập tin từ một tar trực tiếp.

tar là một luồng, ban đầu được dự định cho các ổ đĩa băng không tìm kiếm ngẫu nhiên tốt - trong khi về lý thuyết, có thể trên một hệ thống tệp đĩa có thể đục lỗ / ghi lại tệp còn lại, với việc nén điểm là hầu hết nếu không phải là tất cả phương pháp nén phụ thuộc nhiều vào nội dung xảy ra trước đó trong tệp. Để thực hiện điều này, bạn sẽ cần có kiến ​​thức rất chi tiết về cả phương pháp nén cũng như định dạng tệp tar. Đó là sự phức tạp đến mức không ai có thể bận tâm với nó. Nó rẻ hơn khi chỉ giữ các tệp xung quanh và bỏ qua chúng.

Nếu bạn cần chức năng này, tar có lẽ không phải là những gì bạn muốn.


Những tập tin này chiếm 35% kích thước tài liệu lưu trữ. Những hạn chế bạn chỉ ra dường như làm chỉ áp dụng nếu tôi viết lại các tập tin, không nếu tôi sửa đổi nó out-of-nơi mà tôi có thể làm (Tôi có đủ không gian để lưu các gói lưu trữ gấp đôi). Có một công cụ như vậy?
FUZxxl

Tôi có thể đã hiểu nhầm câu hỏi của bạn sau đó. Nếu bạn sẵn sàng giải nén tar sau tất cả, và đóng gói lại, (chỉ cần không thực sự tạo các tệp tarred - nghĩa là, một tar trực tiếp đến tar tar), có thể là có thể.
frostschutz

Vâng, tôi có thể làm điều đó. Chỉ là các tệp có uids / gids / thuộc tính mà tôi cần giữ gìn. Ngoài ra, tôi không có đủ dung lượng đĩa để lưu đại diện đã giải nén. Tôi có đủ không gian để lưu hai tài liệu lưu trữ mặc dù.
FUZxxl

1
Điều đó không có vấn đề gì cả. Nếu tôi có thể làm điều này trong một lần, thời gian sẽ không quá lâu. Tôi không thể tưởng tượng bất kỳ định dạng lưu trữ nào cho phép xóa nhanh trong khi thực sự giải phóng bộ nhớ.
FUZxxl

1
--wildcardsgiúp đỡ ... Tôi phải đưa ./vào lúc bắt đầu mô hình mặc dù ...
Gert van den Berg

14

GNU tar có một --deletetùy chọn hoạt động với tài liệu lưu trữ ngày nay.

Sử dụng nó như thế này, ví dụ:

tar -vf yourArchive.tar --delete your/path/to/delete

Cẩn thận: Nó hầu như sẽ không hoạt động trên bất kỳ loại phương tiện băng từ. Nhưng tarkhông có vấn đề gì khi làm việc trong một đường ống, vì vậy bạn chỉ có thể sử dụng tệp tar tạm thời và ghi đè lên băng đó sau đó. Nó cũng sẽ không hoạt động trên các tệp nén, vì vậy bạn sẽ cần giải nén tệp.

Ngoài ra, hoạt động sẽ khá chậm trong mọi trường hợp, do tính chất tuyến tính đóng gói (theo thiết kế) của tài liệu lưu trữ tar.


1
Nó tồn tại, nhưng nó không hoạt động với các tệp không thể truy cập ngẫu nhiên (ví dụ: lưu trữ nén) nhưng đây là trường hợp sử dụng của tôi.
FUZxxl

1
Vấn đề khác là tôi không thể chỉ định một mẫu để xóa. Lưu ý nhận xét của tôi từ năm 2013, nơi tôi đã giải quyết những thiếu sót gtar --delete.
FUZxxl

3
@FUZxxl -Thoạt động với --delete--wildcardscho phép bạn sử dụng các mẫu thay vì tên tệp, vì vậy hãy tạo một tệp tạm thời chứa các mẫu và sử dụng unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz. Nó sẽ không thực hiện một regex đầy đủ (nếu bạn cần điều đó, chỉ cần sử dụng tar -tvà xây dựng một danh sách các tên tệp cần xóa), chỉ cần các tên tệp khớp với các mẫu.
Random832

-4

Theo hướng dẫn , bạn có thể chuyển một danh sách tên tệp tarđể chỉ trích xuất chúng. Ví dụ:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo

Tôi không thấy cách --extract giúp tôi. Bạn có thể giải thích? Xin lưu ý rằng tôi không thể giải nén tệp lưu trữ (hoặc các phần quan trọng của nó) vào đĩa.
FUZxxl

2
Xin vui lòng không chỉ đăng liên kết: đây là wiki - thêm nội dung đủ để nó không cần thiết để mọi người rời khỏi trang để hiểu câu trả lời của bạn.
jasonwryan
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.