复制符号链接并指向使用rsync的位置


11

它不需要用来完成rsync,但是不用编写脚本来做到这一点就很好了,它与rsync我想要的非常接近。

rsync -a(或-l)可以保留符号链接,并且-L可以取消引用符号链接并将其复制,就好像它是正常的文件/目录一样。但是,是否可以保留符号链接,还可以复制链接指向的文件/目录?

这是一个例子。假设我们具有以下文件夹层次结构:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirB/not_this_file
dirC/file
dirC/file2
dirD/others

当我这样做rsync -aR dirA dest(或其他方式)时,我希望这些内容出现在dest

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirC/file
dirC/file2

这可能rsync吗?谢谢。

假设具有绝对路径或指向源目录外部的符号链接可以忽略。


1
我觉得你的要求得以确认:你需要,如果dirA/link是一个符号链接../dirB/file,那么这应该是作为复制处理dirB/filedest/dirB/filedirA/linkdest/dirA/link。如果dirA/link链接到该../../another_file怎么办?通常,如果dirA/link指向目录树中更高目录的目录会发生什么?
Riccardo Murri

接得好。在我的用例中,没有指向树外部的链接,并且链接中没有绝对路径。
魏贤

1
我想得越多,就越没有标准实用程序会这样做。在一般情况下,它可能需要创建大量给予单一来源的目的地,如果你有一个符号链接到一个符号或者更一般的符号连接,其目标包含一个符号链接(例如a -> bb -> c/fooc -> d/e:要复制的请求a也应该复制bcc/foodd/ed/e/foo)。
吉尔(Gilles)'所以

@吉尔斯:是的,你是对的。跟踪链接可能会导致包含很多文件,只要它们仍位于源目录中即可。
魏贤

Answers:


2

如果您知道符号链接名称,并且想要传输链接目标,则可以:

rsync -a 'symlink' .
realdir="$(basename "$(readlink -f 'symlink')")"
rsync -a "$realdir" .

第一次rsync只是转移symlink。第二个命令查找真实目录名称,第二个命令rsync传输目录内容。


0

只有当所有这些都在“ mydir”中并且要将​​“ mydir”从一个地方同步到另一个地方时,这才有可能。Rsync无法在您指定的路径之外进行复制(以下链接除外)。例如

mydir/dirA ...
mydir/dirB ...
...

是的,这个假设适合我的用例。所有链接都在mydir内部。
魏贤

@ Wei-Yin然后简单地告诉它不要遵循符号链接...或者我误解了某些东西
xenoterracide 2010年

@xenoterracide:无论您如何调用rsync,我都认为它将为每个源(创建目录除外)创建一个目标。但魏贤要创建两个或多个目的地:链接,它的目标。
吉尔斯(Gillles)“所以-别再邪恶了”

显然我很困惑……
xenoterracide 2010年

@Gilles:没有必要为rsync将遵循符号链接,因为它会同步目标反正。因此,它首先复制了符号链接,从而形成了悬空的符号链接。然后继续复制目录中的所有其他内容,包括符号链接的目标。瞧,一切都很好地融合在一起。
Martin v。Löwis10年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.