通过重命名支持硬链接的本地目录进行同步,等等。
lnsync的Python项目详细描述
同步
概述
lnsync通过重命名本地装入的目录提供单向递归同步,支持硬链接,而无需复制或删除文件数据。为了比较文件,将计算文件哈希值并将其存储在本地数据库中。使用这些文件哈希,lnsync还提供其他功能,例如查找重复文件。
此工具允许在源文件树中的任意文件重命名和移动在目标中快速复制,而无需复制任何文件数据。它可以用作其他同步工具的预处理步骤,例如rsync
硬链接支持
在许多文件系统(例如ext3/4、ntfs、btrfs)上,可以通过多个文件路径访问文件,这些路径充当别名。为现有文件创建的新路径是硬链接,但所有这些别名都处于相同的基础上,因此每个别名都可以称为硬链接。删除文件的最后一个硬链接意味着删除该文件。
如果在源中创建或删除了两个硬链接(不删除文件),并且目标支持硬链接,则同步时lnsync可以根据需要在目标上创建和删除硬链接。与以前一样,这是在不复制或删除文件数据的情况下完成的。
功能性
同步
在源文件树中重命名/移动时,lnsync会尽最大努力同步目标,只重命名文件,通常在目标上创建/删除硬链接,而不删除或复制任何文件数据。目标上不存在于源上的空目录也会被删除。
使用xxhash(一个快速的非加密散列函数)比较文件内容。散列值存储在每个文件树的顶层目录的单个文件数据库中。哈希值数据库是位于已处理树顶部目录的单个文件,basename匹配lnsync-[0-9]+.db
。(只有一个这样的文件应该存在。)所有lnsync操作都会忽略这些文件,应注意不要将它们与其他工具同步。
文件修改时间用于检测过时的哈希值,并且不同步。忽略文件所有权和权限:跳过无法读取的文件。
文件搜索
使用文件内容散列,lnsync还可以找到重复的文件(如fdupe),更一般地,可以根据文件在哪个文件树上显示来查找文件,比较文件树,并检查更改/bitrot。
脱机文件树
lnsync可以将文件树的结构保存在本地目录下,并将其保存在单个文件数据库中。这些脱机文件树可以在大多数lnsync命令中代替本地目录使用,甚至可以用作sync命令中的源。
Linux的替代同步解决方案
许多用于与重命名检测同步的工具中的一些:
rsync的补丁(请参见--detect renamed)根据文件大小和修改时间在目标上提供重命名,以匹配附近目录中的文件。rsync可以保留硬链接并与远程rsync实例同步。
rclone通过重命名为本地客户机和大量远程客户机提供同步。它允许在一些配置之后缓存文件散列。但是,它不保留硬链接。
git本身按内容标识和存储文件,并已进行了调整以进行同步。
现代文件系统(如btrfs)对快照的支持可能适合于同步。
除了同步之外,lnsync允许使用文件哈希数据库根据各种条件搜索文件。
安装和快速启动
安装
使用pip install-u lnsync从pypi存储库安装最新版本
或者使用git clone https://github.com/mrsimoes/lnsync.git
克隆repo并运行python setup.py install
示例用法
如果您的照片存档位于/home/you/photos
且备份位于/mnt/disk/photos
,请运行lnsync sync-n/home/you/photos/mnt/disk/photos
进行试运行,以查看将执行哪些同步操作。要同步,请操作-n
开关。
您将注意到创建了两个数据库文件,一个位于源目录,另一个位于备份目录。文件散列根据需要进行填充,然后存储在这些文件中。数据库文件名包含一个随机后缀,以避免在与lsync以外的工具同步时意外覆盖。
要快速获取将完成同步的rsync命令,跳过lnsync
数据库文件,请运行lnsync rsync/home/you/photos/mnt/disk/photos
。要同时运行此命令,请使用-x
开关。确保此命令提供的rsync
选项适合您。
最后,要通过递归地将目标与源进行比较来检查目标是否同步,请运行lnsync cmp/home/you/photos/mnt/disk/photos
要在photos目录中查找重复文件,请运行lnsync fdupes/home/you/photos
。使用-z
仅按大小进行比较。使用-h
将指向同一文件的不同硬链接计数为不同的文件。如果未提供此选项,则对于每个与其他副本链接的多个副本,将任意选择并打印路径。
要查找照片中不在备份中的所有文件(以任何名称):lnsync onfirstonly/home/you/photos/mnt/disk/photos
要将subdir/home/you/photos/best
同步到数字相框,请使用位于/home/you/photos的数据库哈希:
lnsync sync/home/you/photos/best--root=/home/you/photos/mnt/eframe/
命令参考
所有的lnsync命令都是lnsync[<;global options>;]<;command>;[<;cmd options>;][<;cmd parameters>;]
同步
lnsync[options]<;source>;<;target>;
从源目录(或脱机树)同步目标目录。首先,目标文件与源文件匹配。每个匹配的目标文件都关联到一个源文件。如果任一文件系统支持硬链接,则一个文件可能有多个路径名。如果匹配不唯一或某些文件在源和/或目标上不匹配,LNSync不会抱怨。
对于每个匹配的目标文件,通过重命名、删除或创建硬链接,使其路径名与相应源文件的路径名匹配。根据需要在目标上创建新的中间子目录,并删除目标上变为空的目录。
-z
仅按大小匹配文件。在这种情况下,不会创建或更新哈希数据库。-m=<;size>;
排除所有大于<;size>;的文件,这些文件可能以人体形式给出,例如10K
,2.1M
,3G
-n
干运行,只需显示要执行的操作。--exclude=<;glob_pattern>;
按glob pattern排除源文件和目录。模式的解释与rsync--exclude=<;glob_pattern>;source/target
类似,但具有跨斜线匹配的*
和无*
模式。此选项可以重复,每个--exclude
选项都会影响所有文件树。初始斜线将模式定位到文件树根。尾随斜杠表示该模式仅适用于目录。有一个对应的--include
。有些命令接受--exclude once=<;pattern>;
和--include once=<;pattern>;
,这些命令只应用于开关后的下一个文件树,并获得全局模式的优先权。
总而言之,如果文件或目录在匹配任何include
模式之前匹配exclude
模式,则它将被排除。
lnsync rsync[options]<;tree>;<;dir>;[rsync options]
打印一个从源同步目标目录的rsync命令,跳过lnsync数据库文件。源可以是目录树或脱机树。选中默认的rsync选项。要同时运行rsync命令,请使用-x
开关。
创建、更新和访问哈希数据库
lnsync update<;dir>;
更新哈希数据库,如果不存在新数据库,则创建新数据库,并重新刷新所有新文件和修改时间(mtime)更改的文件。接受--exclude=<;pattern>;
选项。lnsync update<;dir>;
更新哈希数据库,如果不存在新数据库,则创建新数据库,并重新刷新所有新文件和修改时间(mtime)更改的文件。接受--exclude=<;pattern>;
选项。lnsync rehash<;dir>;[<;relpath>;]+
force rehashing由相对于根目录的路径指定的文件lnsync subdir<;dir>;
使用哈希数据库中已存在的任何哈希值在 relsubdir
更新数据库lnsync mkoffline<;dir>;
更新 目录下的数据库
并在outputfile
创建相应的脱机数据库lnsync cleandb<;dir>;
删除过期条目并重新压缩数据库。lnsync lookup<;tree>;[<;relpath>;+]
返回(从数据库或通过重新计算)文件的哈希值,其中tree
可以是目录树或脱机树。
查找文件
lnsync cmp<;tree1>;<;tree2>;
递归比较两个文件树。比较每个路径上的文件,不比较硬链接结构。接受--exclude=<;pattern>;
选项。lnsync fdupes[-h][<;tree>;]+
查找给定树上任何位置重复的文件。lnsync onnal[<;tree>;]+
,lnsync onfirstonly[<;tree>;]+
,lnsync onlastonly[<;tree>;]+
按广告查找文件。一些选项:-m
按最大大小修剪;-0
修剪空文件;-1
在一行中打印每组文件,用空格分隔,并用转义反斜杠和空格,如fdupes
。使用-h
将指向同一文件的多个链接视为不同的文件;如果不使用此选项,请为找到的满足命令条件的每个多个链接文件打印一个任意选择的路径。lnsync check[<;tree>;][<;path>;]*
重新计算给定文件的哈希值,并与存储在数据库中的哈希值进行比较,以检查是否有更改/bitrot。
更多信息
这个包最初是一个python学习项目。我发现它非常有用,可以润色以供出版,但与正在进行的任何工作一样,使用它时应格外小心。
欢迎提出反馈、建议、意见和更正。
您可以在17hs828pkqmixzgy7unba49tycz7laq2ze上用比特币支持此项目。
这个计划绝对没有保证。这是FREe软件,欢迎您在一定条件下重新发布。详情请参阅GNU通用公共许可证v3。限制和未来发展
注意事项和限制
可能的改进
--include
和--exclude
模式更兼容rsync
cmp
以考虑硬链接。发行说明
推荐PyPI第三方库