有没有办法在 tar.gz 存档中添加/更新文件?基本上,我有一个存档,其中包含一个文件,/data/data/com.myapp.backup/./files/settings.txt我想从存档中提取该文件(已完成),并在编辑完成后将其推回存档中。我怎样才能做到这一点?是否因为.在路径中而有问题?
Jan*_*der 58
要从存档中提取文件,您可以使用tar xzf archive.tar.gz my/path/to/file.txt. 请注意,文件路径中的目录也将被创建。使用tar t(ie 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
Run Code Online (Sandbox Code Playgroud)
这可能不是你想听到的,因为这意味着重写整个档案两次。如果它不是一个非常大的档案,最好将整个文件解压缩,然后在编辑后重新压缩它。或者,您可以使用未压缩的存档。
Cal*_*leb 25
tar 文件格式只是一系列文件与几个标题连接在一起。将它拆开,放入您的内容并重新组装起来并不是一项非常复杂的工作。话虽如此,Jander 描述了作为程序的 tar 是如何没有实用功能来执行此操作的,并且压缩还有其他复杂性,必须在进行更改之前和之后进行。
然而,有工具可以完成这项工作!至少有两个系统允许您将压缩的 tar 存档环回安装到文件夹上,然后在文件系统中进行更改。完成后,卸载文件夹,您的压缩档案就可以滚动了。
第一个选项是FUSE的存档挂载项目。这是一个教程。您的系统可能已经有 FUSE,如果没有,您的发行版应该有一个选项。
另一种选择是tarfs。它使用起来更简单,但我听说它在破坏 bzip2 档案方面遇到了一些麻烦,因此您可以先对其进行彻底的测试。
rle*_*man 13
Tar 最初打算用于磁带,因此“替换”文件并不是真正的设计。但是,您可以使用--delete从原始 tar 中删除文件,然后-u更新 tar 并重新添加文件。这可能需要一点时间,因为tar需要在内部重新组织存档。
对于tar.gz文件,根据我的测试,恐怕这是不可能的:
$ tar rvf backup.tar.gz db_bkp_today.sql
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now
Run Code Online (Sandbox Code Playgroud)
但由于只是 Tape Archive ( tar),我尝试了积极的结果:
$ gzip -d backup.tar.gz
$ tar uvf backup.tar db_bkp_today.sql
database_bkp_today.sql
$ tar tvf backup.tar | grep sql
-rw-r--r-- ivanleoncz/ivanleoncz 14779319 2020-05-11 13:40 db_bkp_today.sql
Run Code Online (Sandbox Code Playgroud)
取自man tar:
> -r, --append
Append files to the end of an archive.
Arguments have the same meaning as for -c (--create).
> -u, --update
Append files which are newer than the corresponding copy in the archive.
Arguments have the same meaning as with -c and -r options.
Run Code Online (Sandbox Code Playgroud)
使用-u, 与使用 具有相同的行为-r,因此文件被添加到 TAR 中。
讽刺的是,我看到的添加/更新压缩磁带存档 (tar.gz) 的实用方法是:
gzip -d backup.tar.gztar uvf backup.tar db_bkp_today.sqlgzip -9 backup.tar