在解压缩压缩的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
答案 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
中的文件和符号链接列表。
最后,您可能想要考虑一些可能使托管更容易的替代方案:
/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
确保包含空格的文件名不会导致问题。
for f in `tar ztf files.tar.gz`; do...
当files.tar.gz
中的文件名称中包含空格时,无法工作。