如何检查目录是否包含与 TAR 存档相同的文件?

如何检查目录是否包含与 TAR 存档相同的文件?

假设我有一个文件夹Documents和一个 TAR 文件Documents.tar,如何检查 tar 文件是否包含目录中存在的相同文件?

对我来说更明显的解决方案是:

$ tar xvf Documents.tar -C untarDocs
$ diff -r Documents untarDocs

不幸的是,这对于大型 TAR 文件来说非常慢,还有其他选择吗?

使用tar -dvf Documents.tar(或 --diff、--compare)不起作用,因为它不会检测文件系统中存在但 TAR 文件中不存在的文件,它只检测 TAR 文件中存在但不存在于 TAR 文件中的文件。文件系统例如:

$ mkdir new
$ touch new/foo{1..4}
$ tar cvf new.tar new/
$ touch new/bar
$ tar --diff --verbose --file=new.tar       #### doesn't detect new/bar #########
$ rm new/foo1
$ tar --diff --verbose --file=new.tar

输出

new/
new/foo2
new/foo3
new/foo4
new/foo1
tar: new/foo1: Warning: Cannot stat: No such file or directory   ### works ###

答案1

如果您只想比较文件名和目录名列表,则该-d选项没有帮助。相反,将排序列表与find和进行比较tar -tf就可以了

从 OP 原始示例中假定的名称开始:

$ tar xvf Documents.tar -C untarDocs
$ diff -r Documents untarDocs

这是一个建议的脚本来区分文件名:

#!/bin/sh
MYDIR=$(mktemp -d)
tar tf Documents.tar |sort >$MYDIR/from-tar
find Documents |sort >$MYDIR/from-dir
(cd $MYDIR && diff -r from-tar from-dir)
rm -rf $MYDIR

这假设Documents.tar包含相同的顶级“文档”目录。如果这不是一个好的假设,那么应该过滤列表以删除顶级目录的名称。然而,OP 并没有表明这将是一个问题。

无论如何,列表必须排序,因为不能保证tarfind程序使用哪个顺序。

我用了mktemp因为OP正在使用GNU tar(-d选项),这使得它在 Linux 上成为可能。

当然没有 POSIX tar 可供参考-d帕克斯也不做差异。

答案2

对于标准 tar 存档,这是不可能的。这是因为标准 tar 存档不包含目录内容列表。

通过star当 star 被告知归档增量备份所需的所有内容时出现的增强功能,它可以工作:

1)star -c -dump -C somedir . > /tmp/tarfile

2)star -diff -vv -C comparedir < /tmp/tarfile

您可以使用该选项减少比较的元数据量diffopts=,请参阅手册页。

相关内容