在备份之前检测Linux上已移动或重命名的文件的工具或脚本[关闭]


15

基本上,我正在搜索是否有工具或脚本可以检测已移动或重命名的文件,以便可以获取已重命名/已移动文件的列表,并在网络的另一端应用相同的操作以节省带宽。

基本上,磁盘存储很便宜,但带宽却不便宜,问题在于文件经常会被重组或移到一个更好的目录结构中,因此当您使用rsync进行备份时,rsync不会注意到其已重命名或移动了文件并再次通过网络重新传输,尽管另一端有相同的文件。

因此,我想知道是否存在一个脚本或工具可以记录所有文件的位置及其名称,然后在备份之前,它将重新扫描并检测移动或重命名的文件,然后我可以获取该列表并重新应用另一边的移动/重命名操作。

这是文件的“常规”功能的列表:

  1. 大型不变文件
  2. 它们可以重命名或移动

[编辑:]这些都是很好的答案,最后我要做的就是查看所有答案,并将编写一些代码来解决这个问题。基本上我现在正在考虑/正在研究的是:

  1. 使用“ AIDE”之类的文件进行“初始”扫描,使我能够在文件上保留校验和,因为它们应该永不更改,因此有助于检测损坏。
  2. 创建一个inotify守护程序来监视这些文件/目录,并记录与重命名有关的所有更改并将这些文件移动到日志文件中。
  3. 在某些情况下,inotify可能无法记录文件系统发生了什么事情,因此,最后一步是使用find在文件系统中搜索更改时间晚于上次备份的文件

这有几个好处:

  1. 来自AIDE的校验和/等,以便能够检查/确保某些媒体没有损坏
  2. Inotify使资源使用率保持较低水平,无需一遍又一遍地重新扫描文件系统
  3. 无需修补rsync;如果我必须打补丁,但我宁愿避免打补丁以减轻负担,(IE不需要在每次更新时都重新打补丁)。
  4. 我以前曾经使用过Unison,它的确很棒,但是我可能发誓Unison确实在文件系统上保留了副本,并且其“归档”文件会变得很大?

Answers:


7

6
为什么不集成这些补丁?它们只是添加标志,并不具有干扰性。另一个有趣的补丁是rsyncsums,它可以在rsync运行之间保持校验和。
东武

5

这是一个奇怪的解决方案,但是... git会根据文件内容检测移动并重命名,因此,如果您将有问题的目录置于版本控制之下,则git将能够检测移动等,并避免传输内容(因为它已经在导线的两侧),同时仍在树中移动物体。

只是一个想法。


2
是的,我考虑过这一点,如果文件较小且基于文本,这可能会很好用,但它们是二进制文件,总大小接近TB。
法郎

@Pharaun您需要不带Blob存储的git索引。也许从git中剥离此代码并将其添加到libgit2中。
东武

相关代码以read-cache.c中的refresh_index开头。
东武

5

有趣的建议在这里。还考虑过使用文件系统功能,即ZFS。奇怪的是,没有工具可以做到这一点。在人们报告的情况下,Unison选项在大多数情况下不起作用,对我也不也是。

我希望该功能在重新发布文件夹时能使我的电影收藏的备份同步在第二个硬盘上。

现在,我发现了这个简单的C脚本http://sourceforge.net/projects/movesync/

似乎工作正常。运行它,然后与即正常正常同步。


4

您也许可以使用基于主机的IDS(例如AIDE)并使用其输出编写包装脚本。考虑到校验和,您可能不得不编写更复杂的逻辑。

否则,基于网络的文件系统可能会有意义,因为更改将反映在所有位置。但是,我怀疑您正在通过Internet进行传输,这将限制此处的选项。


这就是我正在考虑做的事情,选择其中之一并加以扩展。另外,是的,我正在通过互联网进行传输,带宽非常有限。
法老

3

您可以尝试统一 ; 特别是

-xferbycopying使用本地副本优化传输(默认为true)

文档中提到的选项为

设置此首选项后,Unison将通过识别目标副本中何时已存在具有所需内容的文件来尝试避免通过网络传输文件内容。通常,这可以使文件移动非常迅速地传播。默认值是true。

看起来它可能会做您想要的。


实际上,事后看来,我对统一的评论可能太草率了。统一更改是否支持用实际文件内容替换硬链接?如果是这样的话,那么我也许可以用rsnapshot + unison做一些魔术,这可以满足我的要求,而不必编写大量新代码/ log / etc来解决这个问题。
法郎

3

Syrep可以满足您的需求。它使消息摘要在文件树上保持最新状态;保持摘要使其比rsync更有效。它是专为sneakernet设计的,因此您可能需要添加一个包装,该包装可以立即进行更新/ makepatch /合并。


2

我不确定是否有现成的工具为您执行此操作,但是您可以编写一个简单的脚本,该脚本仅在比上次备份更新find的基本目录上运行mtime。这将为您提供所有已修改文件的列表。如果仅移动文件,则该文件将不会出现在列表中。不幸的是,此列表将包括文件移入的目录,因为在添加/删除文件时目录会更新。

使用该文件列表,您可以使用rsync仅同步那些文件。rsync具有读取文件列表的选项。这是显示此示例的测试:

$ cd tmp
$ echo test > test
$ ls -la
total 16
drwxr-xr-x 2 root root 4096 Aug 18 11:34 .
drwxr-x--- 5 root root 4096 Aug 18 11:34 ..
-rw-r--r-- 1 root root    5 Aug 18 11:34 test
$ mkdir tmp2
$ find . -mmin 1
$ date
Wed Aug 18 11:35:10 EDT 2010
$ find . -mmin 1
$ find . -mmin 2
.
./test
./tmp2
$ mv test tmp2
$ find . -mmin 1
.
./tmp2

请注意,我在运行每个find命令之间等待了大约1分钟。由此表明,在最初创建文件时,该文件将由列出find。如果将文件移到另一个目录并重新运行该find命令,它将仅显示将文件移至的目录,而不显示文件本身。您可以使用findrsync命令的组合仅列出所需的文件,这可能可以实现您的目标。

我希望这有帮助。


2

考虑到您的工作流程,我想知道在文件级别进行工作(像到目前为止其他人所建议的那样)是否是最佳解决方案。你可以工作...

在文件系统级别

这个想法是让文件系统跟踪备份之间的操作。备份文件系统日志(而不是对文件系统进行备份)(如果要使用现成的备份,可以选择在备份计算机上重放更改)。文件系统日志自然可以在几个字节中表示移动和删除。

使用Fuse可以相对容易地设计位于“真实文件系统”之上的具有特定要求的文件系统。我从未使用过它,但是LoggedFS看起来很有前途。

使用此解决方案,值得某种形式的日志压缩。例如,如果文件已被覆盖10次,则仅将其最后更新保留在日志中。另一个值得进行的优化是识别复制操作,甚至更好地进行编辑(即,创建一个与另一个文件大部分但不完全相同的文件)。我不知道是否有人实施了这个。对于您的工作流程,我认为这并不重要。

在音量上

这个想法是让卷管理器跟踪备份之间的操作。与其备份文件系统,不如使用卷管理器创建快照,然后备份表示为与前一个快照的差异的快照。

如果您要做的只是创建文件,重命名它们并删除它们,那么这应该会很好地工作。检测复制和编辑之类的东西,或者优化删除文件后创建文件的难度要大得多。


实际上,我已经通过inotify在文件“系统”记录器上进行了一些工作以跟踪更改,但是如果更改的速度快于守护程序记录该更改的速度,它将丢失信息,因此需要构建一个备份/扫描以获取初始状态,并在输液失败的情况下进行备份。在文件系统和系统其余部分之间放置某些内容的想法确实似乎是个好主意,然后就像您所说的那样,可以在备份计算机上重放更改。
法老

但是记录的FS看起来确实是一个有趣的项目,唯一关心的是他们在2008/09年停止了dev的开发。不得不玩它,看看它是否能解决问题。
法老

0

Unison对此很有用,但仍然需要在本地复制文件,并且即使文件内容也有少许更改,它也无法检测到移动/重命名。

我编写了一个简单的Python脚本,以使用inode号(仅* nix)检测重命名/移动的文件和目录,并在同步计算机上重播这些更改。您可以单独使用它,也可以将其用作Unison或rsync的“重新命名预处理器”。可以在这里找到

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.