Додати / оновити файл до наявного архіву tar.gz?


73

Чи є спосіб додати / оновити файл в архіві tar.gz? В основному, у мене є архів, який містить файл у, /data/data/com.myapp.backup/./files/settings.txtі я хотів би витягнути цей файл з архіву (вже зроблено) і повернути його назад до архіву, коли редагування буде зроблено. Як я можу це досягти? Це проблематично через .шлях?


2
+1. Це зробить роботу над ОС X настільки простою. На даний момент я маю вручну очистити каталог всіх прихованих файлів, таких як, .DS_Storeа потім переназначити каталог.

Відповіді:


15

Формат файлу tar - це лише декілька файлів, об'єднаних разом з кількома заголовками. Не дуже складна робота, щоб розірвати її, скласти вміст і скласти назад. Враховуючи це , Джандер описав, як tar як програма не має корисних функцій для цього, і є додаткові ускладнення при стисненні, що має бути як до, так і після внесення змін.

Однак є інструменти для роботи! Там є щонайменше дві системи, які дозволять вам здійснити монтування стисненого архіву tar на папку, а потім внести зміни до файлової системи. Коли ви закінчите, відключіть папку і стислий архів готовий до прокатки.

Першим варіантом буде проект архівації для FUSE . Ось підручник з цього питання . Напевно, у вашій системі вже є FUSE, і якщо вона не має вашого розповсюдження, вона повинна мати можливість для неї.

Інший варіант - це тарф . Це простіше у використанні , але я чув, що у нього є певні проблеми з пошкодженням архівів bzip2, щоб ви могли спочатку перевірити це досить ретельно.


1
Я використовую AVFS , який упакований в Ubuntu та Debian. Чи знаєте ви, як архівна величина та таргефи порівнюються з AVFS?
Жиль

Чесно кажучи ні, я не хочу, хоча мені цікаво заглянути в AVFS зараз, коли ви згадуєте про альтернативу. Я використовував і архівну кількість, і tarf, але це вже давно вийшов з експлуатації і не знаю їх сучасного стану. Я наче вирішив із цього досвіду, що ідея помилкова концептуально, навіть якщо реалізація працювала ідеально.
Калеб

Я поглянув на те, як працює архівна частина. Він не модифікує існуючий файл .tar.gz, але коли ви його відключите, він перейменовує оригінал та на його місці створює абсолютно новий файл tar. Якщо ви шукаєте хорошого користувальницького досвіду, це чудово, але якщо ви хочете уникати переписування всього архіву з міркувань ефективності, це вам не допоможе.
Джандер

@Jander Це для того, щоб вказати на це. Я впевнений, що це стосується всіх параметрів стиснення архіву. Проблема полягає в тому, що окремі частини файлу не стискаються, загальні внутрішні заголовки файлів і все стискаються, а для того, щоб інша річ була екстракти, як очікувалося, gzip повинен працювати над усім набором даних. Не існує способу ввести щось в середину, не витягаючи його і не перезавантажуючи стиснення та переписування всього файлу даних. Звідси мій попередній коментар про те, що це неправильне рішення в концептуальному плані . Архів - це архіви.
Калеб

43

Щоб витягнути файл з архіву, ви можете використовувати tar xzf archive.tar.gz my/path/to/file.txt. Зауважте, що також будуть створені каталоги на шляху до файлу. Використовуйте tar t(тобто tar tzf archive.tar.gz), щоб перелічити файли в архіві.

tarне підтримує "на місці" оновлення файлів. Однак ви можете додати файли до кінця архіву, навіть якщо вони мають той самий шлях, що і файл до архіву. У цьому випадку обидві копії файлу будуть знаходитися в архіві, а доданий пізніше файл замінить попередній. Команда, яка використовується для цього, є tar r(або tar uдодавати лише файли, новіші за архів) - це команда, яку слід використовувати. На .шляху не повинно бути проблем.

Однак є улов: ви не можете додати до стислого архіву. Тож вам доведеться зробити:

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

Що, мабуть, не те, що ви хочете почути, оскільки це означає переписання всього архіву двічі. Якщо це не дуже великий архів, можливо, краще буде вилучити всю річ, а потім відредагувати її після редагування. Ви також можете використати нестиснений архів.


Ця відповідь правильна лише в тому випадку, коли вона стосується стандартної tarпрограми. Тар як формат файлу насправді дуже доступний. Ви можете легко написати сценарій для оновлення вмісту самостійно, але є й інші інструменти, які вже роблять це .
Калеб

23
Ви також можете це зробити Unix способом:gzip -dc archive.tar.gz | tar -r data/data/com.myapp.backup/./files/settings.txt | gzip >archive_new.tar.gz
Саймон Ріхтер

2
IIRC ви можете просто об'єднати два файли gzip'ed. Результат - більший файл gzip'ed, який містить об'єднані як нестиснені файли.
FUZxxl

Після розпакування файлу, чи не можливо використовувати прапор - update?
піетро

@FUZxxl +1 за згадку про приєднання gzip
Йохан Буле

9

Дьоготь спочатку призначений для використання на стрічках, тому "заміна" файлів насправді не є дизайном. Однак ви можете використовувати --delete для видалення файлу з оригінального tar, а потім -u для оновлення tar та повторного додавання файлу. Це може зайняти небагато, оскільки tar потрібно внутрішньо реорганізувати архів.


Ласкаво просимо до StackExchange! Ваша відповідь містить лише пропозицію, вже зроблену в іншій відповіді . Будь ласка, прочитайте інші відповіді на питання, перш ніж відповідати, щоб уникнути створення дублікатів.
JigglyNaga

1
Я трохи відредагував свою відповідь. Я не думаю, що інша відповідь згадує --delete
rleibman

-5

в моєму Linux x86_64 GNU / Linux для виконання цієї операції я використовую просто таку команду:

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

Ця команда викликає створення стислого архіву під /pathвикористанням списку файлів, включених у list.txtфайл.


6
Це замінює існуючий файл /path/archive.tarзамість того, щоб додавати / оновлювати його.
Антон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.