GNU tar - 更新 tar 文件,在命令行中覆盖原始文件(可以通过在存档管理器中进行拖放操作实现)

GNU tar - 更新 tar 文件,在命令行中覆盖原始文件(可以通过在存档管理器中进行拖放操作实现)

我想在脚本中通过覆盖原始文件来更新部分内容已修改的 tar 文件。

我尝试了和tar -u,但都不能达到我想要的效果。我还尝试了。-A-r--overwrite

一个简单的测试:

cd ~
mkdir test
echo foo > test1.txt
mkdir test_dir
cd test_dir
echo bar > test2.txt
cd ../..
tar cvf test.tar test
tar tvf test.tar # check content
echo barbarbar >> test/test_dir/test2.txt
tar rvf test.jar test # or Avf, or uvf, it's the same: modified file does not overwrite the original file in the tar
  • -u --overwrite理论上会“更新”,但实际上它只附加而不附加更改的文件,所以我在 tar 中看到两个test1.txt和一个,其中是旧的test2.txttest2.txt
  • -A --overwrite理论上会附加,但是会出错:tar: test: Read error at byte 0, while reading 1024 bytes: Is a directory tar: Error is not recoverable: exiting now
  • -r --overwrite理论上会“附加”,但只会附加,而不会覆盖,因此我在 tar 中看到二test1.txt和二。test2.txt

我想:好吧,那么 tar 不包括就地更新 tar 的可能性。但后来我记得这可以通过将新文件夹拖到 Gnome 中的 tar 文件中轻松实现(我认为这是由“存档管理器”处理的),所以至少是可能的。

如何在命令行/脚本中覆盖 tar 中的文件?

答案1

您可以创建一个脚本,创建另一个 tarball 而不是更新原始 tarball,然后删除原始 tarball 并将新的 tarball 重命名为原始 tarball...

“档案管理器”应用程序可能执行此操作的方式更先进一些,我不会费心尝试在 bash 中模拟这种行为,但这并不意味着你不应该尝试......

答案2

我在 GNUtar文档中找到了此段落,因此不支持覆盖tar。我将从 tar 中删除原始文件,并附加修改后的文件。

https://www.gnu.org/software/tar/manual/html_node/how-to-update.html#how-to-update

4.2.3.1 如何使用 '--update' 更新档案

您必须在“--update”(“-u”)操作中使用文件名参数。如果您不指定任何文件,tar 将不会对任何文件执行操作,也不会告诉您它没有执行任何操作(这可能会让您感到困惑)。

要查看“--update”选项的工作原理,请使用任何文本编辑器在练习目录中创建一个新文件“classical”,并在文件“blues”中添加一些额外文本。然后使用“update”操作和指定的“--verbose”(“-v”)选项调用 tar,并使用“practice”目录中所有文件的名称作为文件名参数:

$ tar --update -v -f collection.tar blues folk rock classical
blues
classical
$

由于我们指定了详细模式,tar 会打印出正在处理的文件的名称,在本例中是需要更新的文件的名称。如果您运行“tar --list”并查看存档,您将在末尾看到“blues”和“classical”。成员“blues”将有两个版本;末尾的版本更新且更大,因为您在更新之前添加了文本。

tar 在更新时不覆盖旧文件的原因是,写入磁带中间部分的过程很困难。磁带不是设计用来向后写入的。有关磁带的更多信息,请参阅磁带和其他存档媒体部分。

编辑: --delete不起作用/非常慢。似乎从 tar 中删除文件不太可行,可能是设计使然。我想我必须提取/删除/重新打包,或者:https://unix.stackexchange.com/questions/68732/remove-files-from-tar-archive 但我还不知道该怎么做。

相关内容