对于 Linux tar 命令:
tar uf test.tar test.txt
但是对于 *BSD bsdtar 命令选项 u = r = append,即无法更新文件,只能附加文件,而且,我尝试编译库存档,证明bsdtar无法更新tar中的文件。
那么,为什么 Linux 中的 tar 命令可以更新 tar 存档中的文件,而 bsdtar 却不能。
答案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”(加上文件元数据头)附加到末尾仍然更容易(并且可能快得多)。