Thêm / cập nhật tệp vào kho lưu trữ tar.gz hiện có?


73

Có cách nào để thêm / cập nhật tệp trong kho lưu trữ tar.gz không? Về cơ bản, tôi có một kho lưu trữ chứa một tệp tại /data/data/com.myapp.backup/./files/settings.txtvà tôi muốn lấy tệp đó từ kho lưu trữ (đã hoàn thành) và đẩy nó trở lại vào kho lưu trữ sau khi chỉnh sửa xong. Làm thế nào tôi có thể thực hiện điều này? Có vấn đề vì .trong đường dẫn?


2
+1. Điều này sẽ làm việc trên OS X thật dễ dàng. Hiện tại, tôi phải dọn dẹp một thư mục của tất cả các tập tin ẩn như thế .DS_Storevà sau đó tar lại thư mục.

Câu trả lời:


15

Định dạng tệp tar chỉ là một chuỗi các tệp được nối với nhau bằng một vài tiêu đề. Đây không phải là một công việc quá phức tạp để tách nó ra, đặt nội dung của bạn vào và đặt nó lại với nhau. Điều đó đang được nói, Jander đã mô tả cách tar như một chương trình không có các chức năng tiện ích để thực hiện điều này và có thêm các biến chứng khi nén, điều này phải xảy ra cả trước và sau khi thực hiện thay đổi.

Tuy nhiên, có những công cụ cho công việc! Có ít nhất hai hệ thống ngoài đó sẽ cho phép bạn thực hiện việc gắn kết vòng lặp của kho lưu trữ tar được nén vào một thư mục, sau đó thực hiện các thay đổi của bạn trong hệ thống tệp. Khi bạn đã hoàn tất, ngắt kết nối thư mục và kho lưu trữ nén của bạn đã sẵn sàng để cuộn.

Tùy chọn đầu tiên sẽ là dự án lưu trữ cho FUSE . Đây là một hướng dẫn về điều đó . Hệ thống của bạn có thể đã có FUSE và nếu nó không phân phối thì bạn nên có tùy chọn cho nó.

Tùy chọn khác là tarfs . Cách sử dụng đơn giản hơn , nhưng tôi nghe nói nó có một số rắc rối với việc lưu trữ bzip2 bị hỏng nên trước tiên bạn có thể kiểm tra điều đó khá kỹ lưỡng.


1
Tôi sử dụng AVFS , được đóng gói trong Ubuntu và Debian. Bạn có biết làm thế nào archivemount và tarfs so với AVFS?
Gilles

Thành thật mà nói tôi không, mặc dù tôi tò mò muốn xem xét AVFS khi bạn đề cập đến giải pháp thay thế. Tôi đã sử dụng cả archivemount và tarfs nhưng đó là một dự án đã ngừng hoạt động từ lâu và không biết tình trạng hiện tại của họ. Tôi đã quyết định từ kinh nghiệm đó rằng ý tưởng đã sai về mặt khái niệm ngay cả khi việc triển khai hoạt động hoàn hảo.
Caleb

Tôi đã xem cách thức hoạt động của archivemount. Nó không sửa đổi tệp .tar.gz hiện có, nhưng khi bạn ngắt kết nối, nó đổi tên bản gốc và tạo một tệp tar hoàn toàn mới ở vị trí của nó. Nếu bạn đang tìm kiếm trải nghiệm người dùng tốt, thật tuyệt, nhưng nếu bạn đang tìm cách tránh viết lại toàn bộ kho lưu trữ vì lý do hiệu quả, nó sẽ không giúp ích cho bạn.
Jander

@Jander Đó là để chỉ ra điều đó. Tôi khá chắc chắn rằng nó áp dụng cho tất cả các tùy chọn gắn kết lưu trữ nén. Vấn đề là các phần riêng lẻ của tệp không được nén, các tiêu đề bên trong tệp tổng thể và tất cả đều được nén và để điều khác giải nén như gzip dự kiến ​​phải được chạy trên toàn bộ tập dữ liệu. Không có cách nào để tiêm thứ gì đó vào giữa cái này mà không giải nén nó và chạy lại quá trình nén và ghi lại toàn bộ tệp dữ liệu. Do đó nhận xét trước đây của tôi về nó là giải pháp sai về mặt khái niệm . Tài liệu lưu trữ là tài liệu lưu trữ.
Caleb

43

Để kéo tập tin của bạn từ kho lưu trữ của bạn, bạn có thể sử dụng tar xzf archive.tar.gz my/path/to/file.txt. Lưu ý rằng các thư mục trong đường dẫn của tệp cũng sẽ được tạo. Sử dụng tar t(tức là tar tzf archive.tar.gz) để liệt kê các tệp trong kho lưu trữ.

tarkhông hỗ trợ cập nhật "tại chỗ" các tệp. Tuy nhiên, bạn có thể thêm tệp vào cuối kho lưu trữ, ngay cả khi chúng có cùng đường dẫn với tệp đã có trong kho lưu trữ. Trong trường hợp đó, cả hai bản sao của tệp sẽ nằm trong kho lưu trữ và tệp được thêm vào sau sẽ ghi đè lên bản trước đó. Lệnh sử dụng cho việc này là tar r(hoặc tar uchỉ thêm các tệp mới hơn tệp lưu trữ) là lệnh sử dụng. Trong .đường dẫn không phải là một vấn đề.

Tuy nhiên, có một nhược điểm: bạn không thể thêm vào kho lưu trữ nén. Vì vậy, bạn sẽ phải làm:

gunzip archive.tar.gz
tar rf archive.tar data/data/com.myapp.backup/./files/settings.txt
gzip archive.tar

Đó có lẽ không phải là những gì bạn muốn nghe, vì nó có nghĩa là viết lại toàn bộ kho lưu trữ hai lần. Nếu nó không phải là một kho lưu trữ quá lớn, tốt hơn là nên gỡ bỏ toàn bộ và sau đó chỉnh lại nó sau khi chỉnh sửa. Thay phiên, bạn có thể sử dụng một kho lưu trữ không nén.


Câu trả lời này chỉ đúng khi nói về tarchương trình tiêu chuẩn . Tar là một định dạng tập tin thực sự rất dễ tiếp cận. Bạn có thể dễ dàng viết một tập lệnh để tự cập nhật nội dung, nhưng có những công cụ khác đã làm điều này .
Caleb

23
Bạn cũng có thể làm điều này theo cách Unix:gzip -dc archive.tar.gz | tar -r data/data/com.myapp.backup/./files/settings.txt | gzip >archive_new.tar.gz
Simon Richter

2
IIRC bạn chỉ có thể ghép hai tệp gzip'ed. Kết quả là một tệp gzip'ed lớn hơn chứa cả các tệp không nén được nối.
FUZxxl

Khi tệp đã được giải nén, không thể sử dụng cờ --update?
pietro

@FUZxxl +1 để đề cập đến việc ghép gzip
Johan Boulé

9

Tar ban đầu được sử dụng để ghi băng, vì vậy các tập tin "thay thế" không thực sự có trong thiết kế. Tuy nhiên, bạn có thể sử dụng --delete để xóa tệp khỏi tar gốc và sau đó -u để cập nhật tar và thêm lại tệp. Có thể mất một chút, vì tar cần tổ chức lại kho lưu trữ trong nội bộ.


Chào mừng bạn đến với StackExchange! Câu trả lời của bạn chỉ chứa một gợi ý đã được đưa ra trong một câu trả lời khác . Vui lòng đọc các câu trả lời khác cho một câu hỏi trước khi trả lời, để tránh tạo ra các bản sao.
JigglyNaga

1
Tôi chỉnh sửa câu trả lời của tôi một chút. Tôi không nghĩ câu trả lời khác đề cập --delete
rleibman

-5

trên Linux x86_64 GNU / Linux của tôi để thực hiện thao tác đó tôi chỉ sử dụng lệnh sau:

tar cvfpz /path/archive.tar -T list.txt

Lệnh này gây ra việc tạo một kho lưu trữ nén /pathbằng cách sử dụng danh sách tệp được bao gồm trong list.txttệp.


6
Điều đó ghi đè lên một tệp hiện có /path/archive.tar, thay vì thêm / cập nhật tệp đó.
Anthon
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.