创建递归 diff 目录。复制参考和差异。重新创建原来的目录

创建递归 diff 目录。复制参考和差异。重新创建原来的目录

我有几个目录/网站资源,每个目录/网站资源的总大小为几千兆字节。它们90%以上相同。有时只修改几个文件。
我需要定期下载这些文件以进行备份。存储空间不是问题,但下载时间太长。

我想:
使用一个这样的目录作为参考(d1)。
1. 对于另一个目录(d2),列出d1和d2之间所有相同的文件,并将其保存到common.txt中。相同意味着相对路径(在 d1 和 d2 内)、文件名和内容相同,忽略所有者/组和时间戳。
2. 将 d2 中但 d1 中不存在的所有文件(包括不同的文件)复制到 d3 中。

然后我将 tarballed d1、d3 和 common.txt 下载到另一台计算机。

将 d3 复制到 d2。
3. 将common.txt 中列出的文件从d1 复制到d2。

您能否建议如何解决步骤(1)、(2)、(3)?

答案1

考虑重复数据删除。是否有任何东西可以直接在您的服务器上修改这些文件(而不是删除并上传新的内容)?如果没有,您可以直接符号链接或硬链接相同的文件。这将节省服务器上的存储空间,并且在使用rsync -H支持硬链接时自动解决您的下载问题。只要您意识到硬链接陷阱(对一个的就地修改会修改所有这些陷阱,因为它们实际上是同一个文件),这就是迄今为止最好的解决方案。

您可以使用fdupes它来有效地查找重复文件。这涵盖了内容方面的重复项,不幸的是,对文件名没有要求。您可以使用它,然后过滤文件名的重复项列表;或者你可以自己进行比较。使用findstatcmp

完全未经改进的示例:

cd d1
find -type f -exec ./compare.sh d1/{} d2/{}

比较.sh:

if [ -f "$1" -a -f "$2" ]
then
    asize=`stat -c%s "$1"`
    bsize=`stat -c%s "$2"`

    if [ "$asize" == "$bsize" ]
    then
        if cmp "$1" "$2"
        then
            echo IDENTICAL "$1" "$2"
        else
            echo DIFFERENT "$1" "$2"
        fi
    fi
fi

由于您提到了 tarball,您可以将它们回显到包含/排除文件列表中,以便与tar --files-from / --exclude-from.

相关内容