我有一个非常有趣的观察,这可能是一个错误的表现。
我的用例是:
- 备份一个文件夹,并将该文件夹中的一组文件添加到 --exclude-from 文件中。我正在使用增量备份(-g 选项集)
- 在新机器上,将 tar 恢复到与原始机器上相同的位置。注意,新机器该位置已经有一些文件;如果存在任何东西,我想替换/覆盖它。
重现步骤
创建文件和文件夹结构如下:
/tmp/src └── etc ├── A.cfg └── config ├── 1.cfg ├── 2.cfg └── 3.cfg
创建排除和包含文件
mbp:tarTests jhartman$ cat /tmp/include.cfg /tmp/src/etc/ mbp:tarTests jhartman$ cat /tmp/exclude.cfg /tmp/src/etc/config/*.cfg
创建档案
$ rm -f /tmp/snapshot $ tar -g /tmp/snapshot -cvz -f /tmp/test.tar.gz -X /tmp/exclude.cfg -T /tmp/include.cfg ./tar-1.27/src/tar: /tmp/src/etc: Directory is new ./tar-1.27/src/tar: /tmp/src/etc/config: Directory is new ./tar-1.27/src/tar: Removing leading `/' from member names /tmp/src/etc/ /tmp/src/etc/config/ /tmp/src/etc/A.cfg
取消存档到新服务器。取消归档之前,新服务器中的文件:
/tmp/src └── etc ├── A.cfg └── config ├── 3.cfg ├── 4.cfg └── 5.cfg
取消归档(在目标机器上)
$TAR_BASE/src/tar --overwrite --extract --force-local --listed-incremental=/dev/null --file /tmp/test.tar.gz -v -C / tmp/src/etc/ tmp/src/etc/config/ ./tar-1.30/src/tar: Deleting ‘tmp/src/etc/config/4.cfg’ ./tar-1.30/src/tar: Deleting ‘tmp/src/etc/config/5.cfg’ tmp/src/etc/A.cfg
所以最终,该文件夹中的文件:
/tmp/src
└── etc
├── A.cfg
└── config
└── 3.cfg
正如您所看到的,尽管4.cfg
它们5.cfg
不在源机器中,但它们已经消失了。我猜这是因为/tmp/src/etc/config/*.cfg
在排除文件中使用。
值得一提的是,这种行为在各个版本中都在变化:1.30、1.27、1.27.1、1.29 - NOK、1.25、1.26、1.28 - OK(其中 NOK 意味着 - 我可以看到删除我关心的文件的消息)。
你怎么认为?
谢谢你,贾里克
更新, 2018-08-21, 20:51
无论我运行哪个版本,--list
操作的输出都是相同的并显示D在config
文件夹中:
tar --list --incremental --verbose --verbose --file /tmp/test.tar.gz
drwxr-xr-x jhartman/staff 16 2018-08-21 20:44 tmp/src/etc/
Y A.cfg
D config
drwxr-xr-x jhartman/staff 22 2018-08-21 20:44 tmp/src/etc/config/
N 1.cfg
N 2.cfg
N 3.cfg
-rw-r--r-- jhartman/staff 30 2018-08-21 20:44 tmp/src/etc/A.cfg
更新 21:03
作为参考,我用于测试的脚本存储在https://github.com/jaroslawhartman/tar-tests回购。
请参阅output.txt
参考资料 详细的测试结果。