2012-03-12 73 views
1

解压缩压缩tar文件之前,备份将被覆盖的文件的最佳方法是什么?解压缩之前在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命令的新隐藏参数。

UPDATE:最好到目前为止,我想出是:

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

回答

1

你有什么是一个好的开始,但有一点要注意的是,xargs的将处理标准输入线组。 (这是人生最终目的:获取无限数量的输入行并执行多次命令,每次输入行的子集作为命令行参数。)当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文件,其中包含在其标准输入,这是列表中提供的文件列表文件和符号链接files.tar.gz

最后,你可能要考虑几个选择,可能使hosuekeeping简单:

  1. 不仅节省掉,实际上已更改的文件,而不是保存过的所有文件。
  2. 或者,不是将文件保存到tar/gzip文件中,而是将文件重命名到位;这样一来,你会马上看到哪些文件具有较新的版本(一个或多个),而不需要去看看成几个不同的/tmp/yyyymmdd_hhmmss.file-backup.tar.gz第一文件:
(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确保包含空格的文件名(S)不会造成问题。越简单当有files.tar.gz在他们的名字空格(或多个)文件

for f in `tar ztf files.tar.gz`; do... 

将无法​​正常工作。

+0

哇,谢谢你的回答。我会测试一下。是的,路径是相对的,脚本将在目标目录中运行。不知道xargs每次做一个子集,并且tar只会有前面的子集。我最好升级脚本pronto。干杯。 – zaf 2012-03-13 08:39:16