更新 tar 中的文件

更新 tar 中的文件

对于 Linux tar 命令:

tar uf test.tar test.txt

但是对于 *BSD bsdtar 命令选项 u = r = append,即无法更新文件,只能附加文件,而且,我尝试编译库存档,证明bsdtar无法更新tar中的文件。

那么,为什么 Linux 中的 tar 命令可以更新 tar 存档中的文件,而 bsdtar 却不能。

参考: tar(Linux) tar(OpenBSD)

答案1

对于 *BSD bsdtar 命令选项 u = r = append,即无法更新文件

我认为它们都附加man tar在 Linux 上说

   -r, --append
          append files to the end of an archive
   -u, --update
          only append files that are newer than the existing in archive

以下测试可以证明这一点

$ uname -s
Linux
$ tar --version
tar (GNU tar) 1.15.1

$ echo aaa > a.txt
$ echo bbb > b.txt
$ echo ccc > c.txt

$ tar cvf x.tar *txt
a.txt
b.txt
c.txt

$ echo BBB > b.txt

$ tar -uvf x.tar b.txt
b.txt

$ tar tvf x.tar
-rw-rw-r-- ian/ian           4 2012-11-08 16:43:10 a.txt
-rw-rw-r-- ian/ian           4 2012-11-08 16:43:17 b.txt
-rw-rw-r-- ian/ian           4 2012-11-08 16:43:26 c.txt
-rw-rw-r-- ian/ian           4 2012-11-08 16:48:22 b.txt

请注意,tar 文件现在包含 b.txt 的旧版本和新版本

好的,接下来是你的疑问

为什么 Linux 中的 tar 命令可以更新 tar 存档中的文件,而 bsdtar 却不能。

您可以在 BSD 中安装 Gnu tar /usr/local/bin/gtar

gtar-1.21-static.tgz (sh) 的软件包信息


更新:

为什么 tar 不能就地更新?

随机存取与串行媒体

“tar”这个名称是“磁带存档”的缩写。该命令旨在用于存储在磁带等串行介质上的存档。磁带驱动器无法将新长度的磁带插入磁带中间,也无法剪掉磁带的现有部分。它也不能在写入的同时读取。要将包含 a.txt、b.txt、c.txt 内容的磁带转换为包含更大 b.txt 的磁带,首先必须读取整个磁带,将内容存储(在内存或磁盘上),然后倒带并完整写入新内容。查找磁带结尾标记并附加新版本的 b.txt 会更快。

此外,许多磁带驱动器(例如 DAT)会在每次写入操作结束时自动添加磁带结束标记,这是无法避免的。因此,即使在现有位置重写相同大小或更小的 b.txt 也会导致 c.txt 永久无法访问。

文件系统问题

无法用长度不同的内容替换文件中间的内容。要用包含“bbbbbb”的文件替换包含“bbb”的文件,您必须读取旧文件并写入新文件。因此,将“bbbbbb”(加上文件元数据头)附加到末尾仍然更容易(并且可能快得多)。

相关内容