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

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

<p>формат файла tar представляет собой просто серию файлов, соединенных вместе с несколькими заголовками. это не очень сложная работа - разорвать ее на части, сложить содержимое и собрать обратно. тем не менее, <a href="https://unix.stackexchange.com/questions/13093/add-update-a-file-to-an-existing-tar-gz-archive/13094#13094">описано джандером</a> потому что tar как программа не имеет вспомогательных функций для этого, и есть дополнительные сложности со сжатием, которое имеет место как до, так и после внесения изменений.</p><p>есть, однако, инструменты для работы! существует как минимум две системы, которые позволят вам выполнить петлевое монтирование сжатого архива tar в папку, а затем внести изменения в файловую систему. когда вы закончите, размонтируйте папку, и ваш сжатый архив готов к работе.</p><p>одним из первых вариантов будет проект <a href="http://www.cybernoia.de/software/archivemount/">archivemount</a> для <a href="http://fuse.sourceforge.net/">fuse</a> . вот <a href="http://www.linux.com/archive/feature/132196">учебник по этому вопросу</a> . в вашей системе, вероятно, уже есть fuse, и, если он не установлен, в вашем дистрибутиве должна быть опция.</p><p>другой вариант <a href="http://sourceforge.net/projects/tarfs/">tarfs</a> . это <a href="http://www.vitanuova.com/inferno/man/4/tarfs.html">проще в использовании</a> , но я слышал, что есть некоторые проблемы с повреждением архивов bzip2, так что вы можете сначала довольно тщательно протестировать это.</p>

<p>чтобы вытащить файл из архива, вы можете использовать <code>tar xzf archive.tar.gz my/path/to/file.txt</code>. обратите внимание, что каталоги в пути к файлу также будут созданы. используйте <code>tar t</code> (то есть <code>tar tzf archive.tar.gz</code>) для просмотра списка файлов в архиве.</p><p><code>tar</code> не поддерживает обновление файлов на месте. однако вы можете добавить файлы в конец архива, даже если они имеют тот же путь, что и файл, уже находящийся в архиве. в этом случае обе копии файла будут находиться в архиве, а файл, добавленный позже, переопределит предыдущую. команда для этого: <code>tar r</code> (или <code>tar u</code>, чтобы добавить только файлы, которые новее, чем архив) это команда для использования. <code>.</code> в пути не должно быть проблем.</p><p>однако есть одна загвоздка: вы не можете добавить в сжатый архив. так что вы должны сделать:</p><pre><code>gunzip archive.tar.gz tar rf archive.tar data/data/com.myapp.backup/./files/settings.txt gzip archive.tar </code></pre><p>что, вероятно, не то, что вы хотите услышать, поскольку это означает переписывание всего архива дважды. если это не очень большой архив, может быть лучше распаковать его целиком, а затем заново отредактировать после редактирования. кроме того, вы можете использовать несжатый архив.</p>

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