rysnc 中的 -k 和 -l 选项

rysnc 中的 -k 和 -l 选项

当阅读手册时rsync,我发现

    -l, --links                 copy symlinks as symlinks
    -L, --copy-links            transform symlink into referent file/dir
        --copy-unsafe-links     only "unsafe" symlinks are transformed
        --safe-links            ignore symlinks that point outside the tree
        --munge-links           munge symlinks to make them safer
    -k, --copy-dirlinks         transform symlink to dir into referent dir
    -K, --keep-dirlinks         treat symlinked dir on receiver as dir

-l匹配至-K-L'-k'

-k 和 -K 不过是 -l 和 -L 的冗余,

它们只是向后兼容还是有任何区别?

答案1

请参阅以下摘录

-l, --links 当遇到符号链接时,在目标上重新创建符号链接。

-k, --copy-dirlinks 此选项使发送方将指向目录的符号链接视为真实目录。如果您不希望指向非目录的符号链接受到影响,则此选项非常有用,因为它们将使用 --copy-links。

如果没有此选项,如果发送方已用指向目录的符号链接替换了目录,则接收方将删除新符号链接中的任何内容,包括目录层次结构(只要 --force 或 --delete 有效)。

另请参阅 --keep-dirlinks 了解接收端的类似选项。

--copy-dirlinks 适用于源目录中的所有符号链接。如果您只想跟踪几个指定的符号链接,可以使用的一个技巧是将它们作为带有尾部斜杠的附加源参数传递,使用 --relative 使路径正确匹配。例如:

  rsync -r --relative src/./ src/./follow-me/ dest/

这是因为 rsync 在给定的源参数上调用 lstat(2),并且尾随斜杠使 lstat(2) 跟随符号链接,从而在文件列表中产生一个目录,该目录覆盖在“src/./”扫描期间找到的符号链接。

-L, --copy-links 遇到符号链接时,将复制它们指向的项目(引用项),而不是符号链接。在旧版本的 rsync 中,此选项还具有副作用,即告诉接收方遵循符号链接,例如指向目录的符号链接。在现代 rsync(例如此版本)中,您需要指定 --keep-dirlinks (-K) 才能获得此额外行为。唯一的例外是将文件发送到太旧而无法理解 -K 的 rsync 时——在这种情况下,-L 选项仍将对较旧的接收 rsync 产生 -K 的副作用。

-K, --keep-dirlinks 此选项使接收方将指向目录的符号链接视为真实目录,但前提是它与发送方的真实目录相匹配。如果没有此选项,接收方的符号链接将被删除并替换为真实目录。

例如,假设您传输包含文件“file”的目录“foo”,但“foo”是接收方目录“bar”的符号链接。如果不使用 --keep-dirlinks,接收方将删除符号链接“foo”,将其重新创建为目录,并将文件接收到新目录中。使用 --keep-dirlinks,接收方将保留符号链接,“file”最终位于“bar”中。

需要注意的是:如果您使用 --keep-dirlinks,则必须信任副本中的所有符号链接!如果不受信任的用户可以创建指向任何目录的自己的符号链接,则该用户随后可以(在后续副本中)用真实目录替换符号链接,并影响符号链接引用的任何目录的内容。对于备份副本,最好使用诸如绑定挂载之类的东西来修改接收层次结构,而不是使用符号链接。

另请参阅 --copy-dirlinks 了解发送端的类似选项。

对于-L和的情况-K

  • -L:当遇到符号链接时,将复制它们指向的项目(引用项),而不是符号链接。
  • -K:此选项使接收方将指向目录的符号链接视为真实目录,但前提是它与发送方的真实目录相匹配。如果没有此选项,接收方的符号链接将被删除并替换为真实目录。

对于-l和的情况-k

  • -l:当遇到符号链接时,在目标上重新创建符号链接。
  • -k:此选项使发送方将指向目录的符号链接视为真实目录。如果您不希望指向非目录的符号链接受到影响,则此选项非常有用,因为它们将使用 --copy-links。

看:https://ss64.com/bash/rsync_options.html

相关内容