工具或脚本来检测Linux上的移动或重命名的文件在备份之前

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

基本上磁盘存储价格便宜,但带宽不是,问题是文件经常会重新组织或移动到一个更好的目录结构,因此当您使用rsync进行备份,rsync不会注意到它的重命名或移动文件并重新通过networking重新传输,尽pipe在另一端有相同的文件。

所以我想知道是否存在一个脚本或工具,可以logging所有文件的位置和名称,然后在备份之前,它将重新扫描并检测移动或重命名的文件,然后我可以采取该列表,并重新申请移动/重命名操作在另一边。

以下是这些文件的“常规”function列表:

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

[编辑:]这些都是很好的答案,最终我最终做的是看所有的答案,并将编写一些代码来处理这个问题。 基本上我现在想/正在做的是:

  1. 使用像AIDE这样的“初始”扫描,并使我能够保持文件的校验和,因为他们应该永远不会改变,所以这将有助于检测腐败。
  2. 创build一个会监视这些文件/目录的inotify守护进程,并logging与重命名文件和将文件移动到日志文件有关的任何更改。
  3. 在某些情况下,inotify可能无法logging文件系统发生了什么情况,因此最后一步是使用find在文件系统中search比上次备份更新后的文件

这有几个好处:

  1. 来自AIDE的Checksum / etc能够检查/确保一些媒体没有被腐化
  2. Inotify保持资源使用率低,不需要一遍又一遍地重新扫描文件系统
  3. 无需修补rsync; 如果我必须补丁,我可以,但我宁愿避免修补东西,以保持较低的负担(IE不需要每次有更新时重新补丁)。
  4. 我之前使用过Unison,它真的很好,但是我可以宣誓Unison确实在文件系统上保留了副本,而其“归档”文件可能变得相当大?

这是一个奇怪的解决scheme,但是… git根据文件内容检测移动和重命名,所以如果你要保持目录在版本控制的问题,那么git将能够检测移动等,并避免传输内容(因为它已经在电线的两侧),同时仍然在树中移动的东西。

只是一个想法。

这里有趣的build议。 也想到使用文件系统function,即ZFS。 奇怪的是没有工具可以做那么简单的事情。 Unison选项在大多数情况下并不适用于人员报告,也不适用于我。

我希望该function可以在重新创build文件夹时同步备份第二块硬盘上的电影集。

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

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

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

否则,基于networking的文件系统可能是有意义的,因为这些更改将在所有位置反映出来。 不过,我怀疑你是通过互联网转移的,这将限制这里的select。

你可以尝试一致 ; 特别是

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

选项在文档中提到

设置此首选项时,Unison将尝试通过识别目标副本中是否存在具有所需内容的文件来避免在networking上传输文件内容。 这通常允许文件移动很快传播。 默认值是true。

看起来可能会做你想做的事情。

Syrep做你所需要的。 它保持文件树上的消息摘要是最新的; 保留文摘使其比rsync更有效率。 它是为sneakernetdevise的,所以你可能想要添加一个更新/ makepatch / merge一次的包装。

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

用这个文件列表,你可以使用rsync来只同步这些文件。 rsync有一个选项来读取文件列表。 这是一个testing显示这个例子:

 $ 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分钟。 从这里可以看出,在最初创build文件时,它会被find列出。 如果将文件移动到另一个目录并重新运行find命令,它只显示我将文件移动到的目录,而不显示文件本身。 您可以使用findrsync命令的组合来只列出您想要的文件,它可能可以实现您的目标。

我希望这有帮助。

考虑到你的工作stream程,我想知道在文件级别工作(就像其他人提出的那样)是最好的解决scheme。 你可以工作…

在文件系统级别

这个想法是让文件系统跟踪备份之间的操作。 备份文件系统日志 (并可select重放备份计算机上的更改,如果需要即时备份),而不是备份文件系统。 文件系统日志自然地expression了几个字节的移动和删除。

保险丝使devise具有特殊要求的文件系统变得相对容易,该要求位于“真正的文件系统”之上。 我从来没有使用它,但LoggedFS看起来很有希望。

有了这个解决scheme,有一些forms的日记压缩是值得的。 例如,如果一个文件被覆盖了10次,只保留它在日志中的最后更新。 另一个有价值的优化是识别复制操作,甚至更好的编辑(即创build大部分但不完全等同于另一个文件的文件)。 我不知道是否有人实施了这个。 对于你的工作stream程,我不认为这很重要。

在音量级别

这个想法是让卷pipe理器跟踪备份之间的操作。 不要备份文件系统,而是使用卷pipe理器创build快照,并备份以前一个快照表示的快照。

如果你所做的只是创build文件,重命名并删除它们,这应该很好用。 检测诸如拷贝和编辑之类的东西,或者优化文件的创build以及删除之后,将会更加困难。

Unison对此很有帮助,但仍然需要在本地复制文件,并且如果文件内容更改了一点,也无法检测到移动/重命名。

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