使用 tar 命令时如何避免覆盖现有文件?

使用 tar 命令时如何避免覆盖现有文件?

柏油一小时前,当我试图制作 tar 来备份它时,命令刚刚覆盖了我的文件。

我跑了

tar zcvf foo.tex foo.bib

之后我的 tex 源文件丢失了。更糟糕的是,这是我第二次以这种方式丢失文件。

我使用 gvim,但 'u' 命令可以恢复我的文件。在浏览了一些有关“备份”、“撤消文件”的帮助条目后,我找不到一种方法来避免 tar 命令再次覆盖我的文件。

然后我尝试从中找到像“-i”这样的参数CP或者MV,但在众多参数中柏油我找不到一个。

我想知道如何避免这种事情再次发生,因为我对下次记得添加新的 foo.tar 东西有点不自信。

答案1

将其添加到您的.bash_login文件中。 alias tar=tar --backup=simple 这会将 ~ 附加到要覆盖的文件中。

因此,当您创建存档时,它将始终运行

tar --backup=simple zcvf foo.tex foo.bib

执行后,将存在 foo.tex~ (这是实际的 tex 文件,存档将位于 foo.tex 中)

答案2

使用输出重定向而不是指定文件名。这适用于许多命令,而不仅仅是 tar。

当然,您的 中已经set -o noclobber(也拼写了) ,对吧?set -C.bashrc

$ tar zc >foo.tex foo.bib
bash: foo.tex: cannot overwrite existing file

如果您经常发出此命令,请不要手动键入:写一个生成文件

foo.tar.gz: foo.tex foo.bib
        tar czf $@ $^

仅当您需要将 tarball 发送给其他人时才使用 tarball,而不是进行备份。不要备份旧版本,而是使用版本控制(CVS、Mercurial、Git 等,无论您喜欢什么)。 (请备份存储库,以防磁盘出现故障或者意外损坏或删除存储库。)

答案3

foo.tex出现此问题的原因是 tar 的“短”选项允许您以混淆属于该选项的方式组合事物f

命令的完整版本(带有现代版本tar)将是:

tar --create --file foo.tex --gzip --verbose foo.big

或使用缩短的选项:

tar -c -f foo.tex -z -v foo.big

根据我的经验,这两种情况都是更明显地错误地写入文件foo.tex

如果你愿意这样做:

tar --create --file --gzip --verbose foo.tex foo.big

你得到一个 file --gzip,我希望你不要经常使用它作为文件名,这样覆盖就不是问题。 (顺便说一句,您可以使用 删除具有此类文件名的文件rm -- --gzip。)

tarwithout的单字符选项-是一种较旧/原始的指定选项的方式。像我一样,Unix 恐龙也倾向于使用它们,但我认为它们令人困惑。我建议单独使用更完整的“虚线”版本,直到您对使用tar.

答案4

首先,记住正确的字符很容易:

  • czf= 创建压缩文件
  • xzf= 解压压缩文件

如果你这样想,你应该总是正确的。

重要数据的另一件事是,将其置于某些版本控制中。我建议git这样做。它将在本地保存您的所有历史记录,并允许您将所有历史记录推送到任何其他介质。 - 非常方便,不再需要使用 tar 进行备份。

相关内容