假设我们的目录中有一个路径,如下所示:
a/b/c/d/e
实际上c
是一个符号链接,
a/b/c -> f
并f
包含d/e
.
然后,当我运行时rsync -avzR
,没有--copy-unsafe-links
标志,它仍然会复制这个“不安全”链接。
预期的:
a/b/c->f
f/d/e
当我跑步时rsync -avzR a/b/c/d/e some_dir
。
实际输出:
a/b/c/d/e
我怎样才能以这种方式获得预期的输出?
答案1
每man rsync
(我的重点):
-R, --相对
使用相对路径。这意味着命令行上指定的完整路径名将发送到服务器,而不仅仅是文件名的最后部分。 [如果]你使用过
rsync -avR /foo/bar/baz.c remote:/tmp/
然后将在远程计算机上创建一个名为 /tmp/foo/bar/baz.c 的文件,并保留其完整路径。这些额外的路径元素称为“隐含目录”(即上面示例中的“foo”和“foo/bar”目录)。
从 rsync 3.0.0 开始,rsync 始终将这些隐含目录作为文件列表中的真实目录发送,即使路径元素实际上是发送端的符号链接。 这可以防止在复制您没有意识到其路径中有符号链接的文件的完整路径时出现一些真正意外的行为。如果要复制服务器端符号链接,请通过其路径包含符号链接,并通过其真实路径包含引用目录。如果您在发送端处理较旧的 rsync,则可能需要使用该
--no-implied-dirs
选项。
因此,您所经历的行为是预期的。
如何克服这个问题?我还没有对此进行测试,但我认为可行的解决方法如下:
mkdir -p some_dir/a/b
rsync -avz a/b/ some_dir/a/b # Trailing slash after first 'b'
rsync -avz a/b/c/f some_dir # No trailing slash after 'f'
我还建议阅读符号链接手册页的部分rsync
。
答案2
我无法复制你的行为。我创建了一个脚本来设置目录然后复制它。它内部有一个相对和一个绝对符号链接。使用您显示的选项 ( -avzR
),它不应下降到任一选项,而应将链接复制为链接。
我认为我误解了您正在尝试的某些方面。因此,如果您发现那是什么,您可以添加到您的问题中,或者您可以运行此脚本并查看您的行为是否与我显示的不同。
脚本:
#!/bin/sh
SRC=/tmp/syncsrc
DEST=/tmp/syncdest
rm -rf $SRC $DEST
mkdir -p $SRC/a/b
mkdir -p $SRC/f/d
touch $SRC/f/d/e
ln -s ../../f $SRC/a/b/c
ln -s $SRC/f $SRC/a/b/g
mkdir $DEST
rsync -avzRi $SRC/a $DEST
输出
sending incremental file list
cd+++++++++ /tmp/
cd+++++++++ /tmp/syncsrc/
cd+++++++++ /tmp/syncsrc/a/
cd+++++++++ /tmp/syncsrc/a/b/
cL+++++++++ /tmp/syncsrc/a/b/c -> ../../f
cL+++++++++ /tmp/syncsrc/a/b/g -> /tmp/syncsrc/f
目的地是用里面的符号链接创建的
$ find /tmp/syncdest \( -type l -printf '%h/%f -> %l\n' \) -o -printf '%h/%f\n'
/tmp/syncdest
/tmp/syncdest/tmp
/tmp/syncdest/tmp/syncsrc
/tmp/syncdest/tmp/syncsrc/a
/tmp/syncdest/tmp/syncsrc/a/b
/tmp/syncdest/tmp/syncsrc/a/b/c -> ../../f
/tmp/syncdest/tmp/syncsrc/a/b/g -> /tmp/syncsrc/f