我有一个目录,其中包含指向系统上不同媒体上的其他目录的符号链接:
/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