基本上我正在search是否存在可以检测移动或重命名文件的工具或脚本,以便我可以获得重命名/移动文件的列表,并在networking的另一端应用相同的操作以节省带宽。
基本上磁盘存储价格便宜,但带宽不是,问题是文件经常会重新组织或移动到一个更好的目录结构,因此当您使用rsync进行备份,rsync不会注意到它的重命名或移动文件并重新通过networking重新传输,尽pipe在另一端有相同的文件。
所以我想知道是否存在一个脚本或工具,可以logging所有文件的位置和名称,然后在备份之前,它将重新扫描并检测移动或重命名的文件,然后我可以采取该列表,并重新申请移动/重命名操作在另一边。
以下是这些文件的“常规”function列表:
[编辑:]这些都是很好的答案,最终我最终做的是看所有的答案,并将编写一些代码来处理这个问题。 基本上我现在想/正在做的是:
这有几个好处:
Unison http://www.cis.upenn.edu/~bcpierce/unison/声称能够检测移动和重命名。
有几个补丁rsync添加移动/重命名检测:
Bugzilla条目跟踪这个问题: https ://bugzilla.samba.org/show_bug.cgi?id = 2294
这是一个奇怪的解决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命令,它只显示我将文件移动到的目录,而不显示文件本身。 您可以使用find和rsync命令的组合来只列出您想要的文件,它可能可以实现您的目标。
我希望这有帮助。
考虑到你的工作stream程,我想知道在文件级别工作(就像其他人提出的那样)是最好的解决scheme。 你可以工作…
这个想法是让文件系统跟踪备份之间的操作。 备份文件系统日志 (并可select重放备份计算机上的更改,如果需要即时备份),而不是备份文件系统。 文件系统日志自然地expression了几个字节的移动和删除。
保险丝使devise具有特殊要求的文件系统变得相对容易,该要求位于“真正的文件系统”之上。 我从来没有使用它,但LoggedFS看起来很有希望。
有了这个解决scheme,有一些forms的日记压缩是值得的。 例如,如果一个文件被覆盖了10次,只保留它在日志中的最后更新。 另一个有价值的优化是识别复制操作,甚至更好的编辑(即创build大部分但不完全等同于另一个文件的文件)。 我不知道是否有人实施了这个。 对于你的工作stream程,我不认为这很重要。
这个想法是让卷pipe理器跟踪备份之间的操作。 不要备份文件系统,而是使用卷pipe理器创build快照,并备份以前一个快照表示的快照。
如果你所做的只是创build文件,重命名并删除它们,这应该很好用。 检测诸如拷贝和编辑之类的东西,或者优化文件的创build以及删除之后,将会更加困难。
Unison对此很有帮助,但仍然需要在本地复制文件,并且如果文件内容更改了一点,也无法检测到移动/重命名。
我做了一个简单的Python脚本来检测使用inode数字(* nix)重命名/移动的文件和目录,并在同步机器上重播这些更改。 您可以单独使用它,也可以将其用作Unison或rsync的“重命名预处理器”。 它可以在这里find