在跟踪符号链接时执行 rsync

在跟踪符号链接时执行 rsync

我有一个目录,其中包含指向系统上不同媒体上的其他目录的符号链接:

/opt/lun1/2011
/opt/lun1/2010
/opt/lun2/2009
/opt/lun2/2008
/opt/lun3/2007

但符号链接显示为:

/files/2011
/files/2010
/files/2009
/files/2008
/files/2007

我如何执行rsync跟随符号链接的操作?

例如:

rsync -XXX /files/ user@server:/files/

答案1

rsync 的标志-L将同步链接到的文件或目录的内容,而不是符号链接。

答案2

你需要两个都 -L如果-K您在两侧都有符号链接,例如您已经完成了第一次 rsync,并且想要使用 rsync 更新备份。

    -L, --copy-links            transform symlink into referent file/dir
    -K, --keep-dirlinks         treat symlinked dir on receiver as dir

在这种情况下,如果您仅使用-L,接收方的符号链接将被消除,并且将创建新的真实目录。

答案3

刚刚遇到了这个问题。如果您希望 rsync 将符号链接目录视为目录,则需要K选项

rsync -K /files/ user@server:/files/

答案4

这个问题已经很老了,但我会在这里留下更完整的答案,以防其他人遇到这个问题。

让我们从最简单、最通用的方法开始。在几乎所有情况下,最好的选择是使用 -a (--archive) 开关。此方法将“跟踪符号链接”并在目标目录中准确重现它们。

rsync -a /files/ user@server:/files/

一些背景知识:-a|--archive 开关是以下开关的别名:-rlptgD

  • (-r|--recursive):递归进入目录
  • (-l|--links):将符号链接复制为符号链接
  • (-p|--perms):保留权限
  • (-t|--times):保留时间
  • (-g|--group):保留组

并且 -D 开关本身是以下开关的别名:

  • (--device):保存设备文件(需要root)
  • (--specials):保留特殊文件

使用带有 -a 开关的 rsync 将复制源目录中的所有文件类型、子目录和符号链接。

相反,如果您希望将符号链接文件和目录转换为实际文件和目录 - 同时保持“-a”中包含的合理存档设置 - 您可以附加 -L 开关(因此它将优先于 -l 或使用 -rLptgD)。

rsync -aL /files/ user@server:/files/

可以说,这种方法是其他答案中的 -LK 开关的更安全/更理智的版本。

但是,如果目标是保留内部符号链接(其目标在源目录树内)并在符号链接为外部时包含实际文件和目录,则需要采用不同的方法。在 bash(和相关 shell?)中,类似下面的方法可以工作:

#!/bin/bash
src="./source"
dest="./dest"
rsync -a --save-links ${src} ${dest}
abs_src="$(realpath -- ${src})"
for i in $(find ${src} -type l); do
  target="$(target="$(readlink -f -- $i)" && echo "${target%/*}")"
  while [[ $target && ( ! $abs_src -ef $target ) ]]; do target="${target%/*}"; done
  test ! ${target} && rsync -aL ${i} ${i/$src/$dest}
done

相关内容