![使用 tar 命令时如何避免覆盖现有文件?](https://linux22.com/image/44867/%E4%BD%BF%E7%94%A8%20tar%20%E5%91%BD%E4%BB%A4%E6%97%B6%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E8%A6%86%E7%9B%96%E7%8E%B0%E6%9C%89%E6%96%87%E4%BB%B6%EF%BC%9F.png)
这柏油一小时前,当我试图制作 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
。)
tar
without的单字符选项-
是一种较旧/原始的指定选项的方式。像我一样,Unix 恐龙也倾向于使用它们,但我认为它们令人困惑。我建议单独使用更完整的“虚线”版本,直到您对使用tar
.
答案4
首先,记住正确的字符很容易:
czf
= 创建压缩文件xzf
= 解压压缩文件
如果你这样想,你应该总是正确的。
重要数据的另一件事是,将其置于某些版本控制中。我建议git
这样做。它将在本地保存您的所有历史记录,并允许您将所有历史记录推送到任何其他介质。 - 非常方便,不再需要使用 tar 进行备份。