rsync:避免删除不属于某个用户的文件

rsync:避免删除不属于某个用户的文件

我正在使用 rsync 将大型共享文档文件夹与我的笔记本电脑保持同步。更具体地说,我正在从我的笔记本电脑同步到共享存储库。我想要做的是仅同步那些由我的用户创建/修改的文件。作为共享存储库,其他人可能已经创建了其他目录或文件。

我浏览了各种 rsync 选项,但还是没找到我想要的。我可以--exclude--delete-excluded但只能给出匹配文件名的模式,而不是任何其他元数据(或者我可以吗?)。

一个替代的但有点麻烦的解决方案可能是启动一个远程脚本,如find -not -perm $USER > excluded_filesrsync 并排除这些,但我不想这样做。

有任何想法吗?

更新:澄清一下,我的笔记本电脑上的数据只是服务器上数据的一部分。以下是示例

  • 我的笔记本电脑dir_1包含dir_2
  • 我将它们 rsync 到服务器;现在服务器包含两个目录
  • 另一个用户登录服务器并创建一个新目录dir_3
  • 我的文件弄乱了,现在需要再次 rsync,但需要使用 --delete
  • 我想 --删除我首先创建的文件,即 和 上的dir_1文件dir_2不是 dir_3

答案1

我认为保留笔记本电脑上所有文件的副本不是一个选择。否则,这会容易得多。

这里合适的工具是版本控制工具。但我意识到,除非所有用户都具备最低限度的技术水平,否则让他们使用版本控制工具并不是一个现实的建议。即便如此,你也必须仔细挑选在笔记本电脑上检查的内容。

可能仍会使用版本控制。在共享机器上,签入所有文件,不要管其他人的文件。在笔记本电脑上保留单独的签出。每次切换机器时都提交并签出。我越想越喜欢这个选项:它不需要任何编码,甚至不需要任何脆弱的脚本。


您进行双向同步。Rsync 不擅长此道:如果您忘记运行它,或者不小心以错误的方向运行它,您可能会毫无预警地丢失工作。齐奏是一款出色的双向同步工具:它始终进行双向同步,并且如果文件在两端均发生更改,它会发出警告。它是开源的,并且与 unix 和 Windows 平台完美集成。

不幸的是,unison 没有按所有者忽略文件的选项,rsync 也是如此。您可以使用 生成忽略列表find -user,但它会变得混乱,并且如果其他人在 和 或 之间添加或删除文件,就会出现find竞争unison条件rsync

您可以修补 rsync 或 unison,以添加根据元数据忽略文件的选项。我刚刚快速浏览了一下源代码,在这两种情况下,排除代码都与字符串紧密相关,而不是与目录条目紧密相关。这看起来可行,但这不是一个简单的补丁。


您可以创建仅包含您的文件的文件系统视图。我没有完整、无缝的解决方案,但这里有一些想法可以供您参考。

  • 如果共享机器支持硬链接(所有 Unix 系统都支持硬链接,只要您使用 NTFS,Windows 从 NT4 开始也支持硬链接),那么创建仅包含文件硬链接的存储库副本就很容易了:

    cd /shared/repository
    find . -user "$USER" -exec sh -c 'mkdir -p "/my/view/${0%/*}" &&
                                  ln "$0" "/my/view/$0"' {} \;
    

    或者使用 zsh:

    autoload zmv
    zmv -L -Q '/shared/repository/(**/)(*)(u$UID)' "/my/view/$1$2"
    

    编辑或同步时,您必须小心不要破坏硬链接。我不知道 rsync 和 unison 会如何应对。初始创建后,共享存储库中您拥有且链接数为 1 的文件将被删除,而您视图中链接数为 1 的文件将在共享存储库中进行链接。这一切都很笨拙,我欢迎改进建议。

  • 如果共享机器支持保险丝,您可以使用它来创建仅包含您的文件的共享存储库的实时视图。我不知道任何现有的 FUSE 文件系统可以做到这一点,但是绑定文件系统接近(我还没有查看代码来评估编码难度)。

  • 您可以在运行 rsync 或 unison 时使用LD_PRELOAD它来覆盖readdir(或 Windows 等效项),以便它只返回您拥有的文件。

相关内容