it-swarm-ru.tech

Добавить / обновить файл в существующий архив tar.gz?

Есть ли способ добавить/обновить файл в архиве tar.gz? По сути, у меня есть архив, который содержит файл в /data/data/com.myapp.backup/./files/settings.txt и ​​я хотел бы вытащить этот файл из архива (уже сделано) и отправить его обратно в архив после завершения редактирования. Как я могу сделать это? Это проблематично из-за . в пути?

78
Naftuli Kay

Формат файла tar представляет собой просто серию файлов, соединенных вместе с несколькими заголовками. Это не очень сложная работа - разорвать ее на части, сложить содержимое и собрать обратно. Тем не менее, описано Джандером потому что tar как программа не имеет вспомогательных функций для этого, и есть дополнительные сложности со сжатием, которое имеет место как до, так и после внесения изменений.

Есть, однако, инструменты для работы! Существует как минимум две системы, которые позволят вам выполнить петлевое монтирование сжатого архива tar в папку, а затем внести изменения в файловую систему. Когда вы закончите, размонтируйте папку, и ваш сжатый архив готов к работе.

Одним из первых вариантов будет проект archivemount для Fuse . Вот учебник по этому вопросу . В вашей системе, вероятно, уже есть Fuse, и, если он не установлен, в вашем дистрибутиве должна быть опция.

Другой вариант tarfs . Это проще в использовании , но я слышал, что есть некоторые проблемы с повреждением архивов bzip2, так что вы можете сначала довольно тщательно протестировать это.

18
Caleb

Чтобы вытащить файл из архива, вы можете использовать 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

Что, вероятно, не то, что вы хотите услышать, поскольку это означает переписывание всего архива дважды. Если это не очень большой архив, может быть лучше распаковать его целиком, а затем заново отредактировать после редактирования. Кроме того, вы можете использовать несжатый архив.

48
Jander

Изначально Tar предназначался для использования с лентами, поэтому "замена" файлов в действительности не предусмотрена. Однако вы можете использовать --delete для удаления файла из исходного tar, а затем -u для обновления tar и повторного добавления файла. Это может занять некоторое время, так как tar нуждается в внутренней реорганизации архива.

9
rleibman