确保下载的内容不是重复的

确保下载的内容不是重复的

我想(递归地)从 WebDav 服务器将文件目录下载到某个位置。如果文件已经存在(某处),则不应再次下载。但是文件夹结构并不相同。

有没有简单的方法可以做到这一点?我研究过 fdupes,但它只是用于检测和删除重复项。文件非常大,开销太大了。

目标文件系统不支持重复数据删除。我知道cp -n(从 FUSE 挂载点来看)不会覆盖现有文件,但文件夹结构不一样。所以我有点不知所措。

答案1

从看WebDAV 可用的 Linux 客户端,我个人喜欢的方法是:

  1. 使用 GVFS 或其中一个 WebDAV 文件系统模块 (davfs2 或 fusedav) 将远程 WebDAV 服务器的文件“映射”到本地文件系统路径。

  2. 使用内置cp命令,并带有-n指示其“不破坏”目标中的文件的选项。请注意,某些 shell(例如dashUbuntu 上的 shell)将默认执行builtin的版本,并且此内置命令可能不支持该选项。为获得最佳效果,请确保通过运行或(取决于二进制文件在特定系统上的位置)执行 GNU Coreutils 版本。cp-ncp/bin/cp/usr/bin/cp

编辑:我误读了你最初的问题。

我认为你所说的情况是,文件file1.txt存在于 WebDAV 服务器中的两个不同路径中,并且内容这两个文件完全相同。而且由于您已经有了该文件的一个副本,您不想下载该文件的第二份或第三份副本,因为这会浪费带宽?

出色地,从客户端,这将非常困难。原因如下。

你必须看看你在比较什么确定文件是否唯一,以及要求/成本进行这样的比较。

假定(错误地)你比较的是小路相对于 WebDAV 文件夹结构的根目录。进行路径相等性比较的成本非常简单:只需查看两个路径字符串(如)/dir1/dir2/file1.txt,看看字符串是否匹配。如果匹配,则为重复。如果不匹配,则不是。

您可以比较的另一件事是文件姓名,忽略小路。那么,例如,你会认为这两个文件是重复的吗:/dir1/dir2/file1.txt/dir3/dir4/file1.txt?好吧,如果你仅有的比较基于姓名,那么这些将被视为重复。但是,我们可以根据需要混合搭配各种重复测试,以便为我们的用例制定正确的测试类型。

其他不太有用的比较属性包括文件大小属性(也称为元数据)、文件扩展名等。这些东西在重复判断方面并没有给你提供太多的依据,因为在大多数情况下,很容易构造一个具有与另一个文件相同属性但内容完全不同的文件,并且如果内容不同,大多数人不会认为这两个文件是重复的。

我认为,你可以比较的最重要的东西是文件内容。不幸的是,从 WebDAV 客户端的角度来看,除非您已经下载了文件,否则您无法知道文件内容。就客户端而言,文件内容可能会在文件传输期间或之后发生变化,在这种情况下,如果您重新下载文件,重复比较的结果将会发生变化。

比较文件内容有两种基本方法:逐字节, 和哈希逐字节检查是检查重复项最“有保障”的方法,但它有一个限制,即你必须比较整个文件,这对于大量数据来说非常慢。另外,考虑到重复检测的基本算法复杂度是O(n^2),这意味着您必须将每个文件的内容与其他文件的内容进行比较,以确定它是否是重复的。使用加密哈希来比较文件可以大大减少必须比较或传输的数据量,但缺点是,您引入了两个文件实际上可能相等的可能性,这种可能性非常小不同的但具有相同的哈希值——称为哈希碰撞。

但同样,从客户角度来看,不可能知道什么文件内容或其哈希值,除非您执行以下操作:

  • 从服务器下载文件;或者
  • 说服服务器在本地为您计算哈希值,然后下载该哈希值。

在前一种情况下,你正在下载文件以确定它是否是重复的,以避免下载文件,所以你显然不能这样做——你正在浪费你试图避免的带宽只是为了进行比较

在后一种情况下,你可能已经发现了一些问题。一个非常大的文件的 SHA1 哈希只有几个字节,只占这个大文件大小的一小部分。下载所有文件的哈希值并进行比较是相当实用O(n^2)哈希以确定要下载哪个文件。但是,如果在执行这些比较时服务器上的文件数据发生变化,您仍然会遇到竞争条件问题,因此,如果同步对您很重要,则需要确保将同步考虑在内。

因此,结论是:

  • 如果你没有对 WebDAV 服务器的完全软件控制权,也无法更改其配置,因此你几乎无法确定自己是否已经拥有相同的副本文件内容这些文件存储在服务器上的多个文件中,除非服务器管理员已经为服务器上的每个文件提供了某种哈希文件,如果您可以依赖哈希值,这可能会给您带来一定程度的成功。
  • 如果对 WebDAV 服务器拥有完全的软件控制权,并且有能力的要更改其配置,您可能需要编写一个脚本或程序(或使用现有的脚本或程序)来创建一个扩展名为 的哈希文件,例如,将其放在.sha1sum与 WebDAV 服务器托管的每个文件相同的目录中。这样您就可以只下载哈希并进行比较,与文件大小相比,带宽成本相对较低,假设您的文件大小超过几千字节。

相关内容