rsync 子目录中的文件列表到远程服务器并删除无关的

rsync 子目录中的文件列表到远程服务器并删除无关的

我一直没能找到这个问题的答案。我尝试过--include--exclude-r--delete-excluded和源目录的各种组合。

这就是我想要实现的目标:

  • 源码目录:

    Dir1/File1-1
    Dir1/File1-2
    Dir2/File2-1
    Dir2/File2-2
    Dir2/File2-3
    Dir3/File3-1
    Dir3/File3-2
    Dir3/File3-3
    ...
    
  • 目标目录:(
    状态未知)

我想做的是提供源目录中预定义的文件子集和相对路径,并将它们同步到远程目标,删除目标上不属于文件子集的任何内容(包括目录) 。

例如,给定上面的源目录:

  • 我的预定义文件列表:

    Dir1/File1-2
    Dir3/File3-3
    
  • 目标目录:

    Dir1/File1-1
    Dir1/File1-2
    Dir2/File2-1
    Dir3/File3-1
    

完成后,我希望目标中只有 Dir1/File1-2、Dir3/File3-3,而没有 Dir2。我也不希望 Dir1/File1-2 被再次复制。

注意事项:

  • 这些是非常大的文件,我试图防止在不需要时再次远程复制它们。
  • 源子目录的内容每天都在变化
  • 预定义列表每天都会变化,但可能会/将包括昨天列表中的文件
  • 源目录中有 0 个文件。它仅包含包含同步所需文件的子目录
  • 源代码中的子目录是相当静态的。即 Dir1、Dir2 和 Dir3 将始终存在

我将继续努力,看看是否能找到我正在寻找的解决方案。

更新:

首先我要感谢jw013用于格式更改。我遵循了帮助指南,但不明白为什么格式不正确(第一次海报)。

使用来自的建议哔叽,我想出了以下命令,但它仍然没有从目标中删除不在文件列表中的无关文件。

  • 命令

    rsync -avRP --prune-empty-dirs --delete-delay --ignore-existing $FILE_LIST destination/
    

答案1

您可以使用以下方法执行此操作

rsync -av --delete --update --include-from=LISTFILE   -f 'hide,! */' src/ dst

其中LISTFILE是包含应同步到目标目录的所有文件的文件。如果您的文件没有更改,您可以--ignore-existing使用--update.阅读rsync 手册页了解详情。

答案2

如果源中不存在文件,您可以与 rsync 一起使用许多删除选项来删除目标上的文件:

        --del                   an alias for --delete-during
        --delete                delete extraneous files from dest dirs
        --delete-before         receiver deletes before xfer, not during
        --delete-during         receiver deletes during the transfer
        --delete-delay          find deletions during, delete after
        --delete-after          receiver deletes after transfer, not during

此外,您可以使用--ignore-existing跳过复制目标中存在的文件:

        --ignore-existing       skip updating files that exist on receiver

要删除空目录,您应该使用:

    -m, --prune-empty-dirs      prune empty directory chains from file-list

所以,命令

rsync -av --prune-empty-dirs --delete-delay --ignore-existing src/ dst

我想会做你正在寻找的事情

答案3

我认为你需要关注--delete-excluded。我在本地尝试过,似乎可以按要求工作。我会先尝试

rsync -a --delete-excluded --include-from=LISTFILE --exclude="*" src/ dst

我不确定为什么建议某些其他选项:P。最“有趣”的是--ignore-existing。可能值得确保您首先了解更友好的优化 --a-u

看起来您已经在使用-a,这意味着-t,它允许 rsync 默认进行优化。 “Rsync 使用“快速检查”算法(默认情况下)查找需要传输的文件,该算法查找大小或上次修改时间已更改的文件”。如果您不使用-a,通常可以使用“-u--update - 跳过接收器上较新的文件”。

如果您想通过“快速检查”优化来衡量差异残疾人, 您可以使用--checksum。 (如果您想在损坏的情况下在某个时刻强制重新同步所有现有文件,它也很有用。启用-v后您将能够看到哪些文件必须重写)。

相关内容