在解压缩以进行简单回滚之前,在tar存档中列出的备份文件

时间:2012-03-12 13:08:02

标签: linux macos tar rollback

在解压缩压缩的tar文件之前,备份将被覆盖的文件的最佳方法是什么?

例如,给定输入存档files.tar.gz包含:

path/to/fileA.txt
path/to/fileB.txt
path/to/fileC.txt

目前在我们的文件系统上:

path/to/fileA.txt
path/to/fileC.txt

由于fileA.txt和fileC.txt将被覆盖,我们希望files-backup.tar.gz只包含这两个原始文件。

目前我手动执行此操作以获得粗略的回滚机制,如果事情无法解决的话。在几个地方有超过一些文件,这可能会变得很痛苦。

很想编写脚本或学习tar命令的新隐藏参数。

更新:到目前为止,我提出的最好的是:

tar ztf files.tar.gz | xargs tar zcvf /tmp/file-backup.tar.gz

1 个答案:

答案 0 :(得分:1)

你所拥有的是一个良好的开端,但需要注意的一点是,xargs将在组中处理stdin行。 (这毕竟是它在生活中的全部目的:获取无限数量的输入行并多次执行命令,每次输入行的子集作为命令行参数。)当files.tar.gz具有大量的文件,xargs会一次对它们的子集进行tar zcvf /tmp/file-backup.tar.gz!生成的/tmp/file-backup.tar.gz将仅包含文件的最后一个子集!

我将假设您将路径指定为path/.../...,所有路径都是相对的。

这是一个更好的解决方案(请参阅"说明"以下使用tar ...|while read...):

(tar ztf files.tar.gz|while read f; do if [ -f "$f" -o -h "$f" ]; then echo "$f" ; fi; done)|tar Tcfz - /tmp/`date '+%Y%m%d_%H%M%S'`.file-backup.tar.gz

tar命令生成一个名为/tmp/yyyymmdd_hhmmss.file-backup.tar.gz的文件,其中包含stdin上提供的文件列表,这是files.tar.gz中的文件和符号链接列表。

最后,您可能想要考虑一些可能使托管更容易的替代方案:

  1. 仅保存实际已更改的文件,而不是保存每个文件。
  2. 或者,不是将文件保存到tar / gzip文件中,而是将文件重命名为;通过这种方式,您可以立即看到哪些文件包含较新版本,而无需先查看几个不同的/tmp/yyyymmdd_hhmmss.file-backup.tar.gz文件:
  3. (TAG=`date '+%Y%m%d_%H%M%S'` ; tar ztf files.tar.gz|while read f; do if [ -f "$f" -o -h "$f" ]; then mv "$f" "$f.$TAG" ; fi; done)

    注意:tar ztf ...|while read f确保包含空格的文件名不会导致问题。

    更简单
    for f in `tar ztf files.tar.gz`; do...
    
    files.tar.gz中的文件名称中包含空格时,

    无法工作。