Jea*_*let 28 rsync hardlink mac-osx
有时,我必须对服务器上的数据文件执行几次大型迁移更改,我正在寻找一种好方法来执行此操作。我正在考虑使用 rsync 从根数据文件夹开始复制我的目录结构,创建指向所有原始文件的硬链接(其中一些文件相当大),并且我可以在目标树中仅覆盖需要迁移的文件。最后,我可以通过两次mv操作安全地从旧文件切换到新文件。
但是,我似乎无法让 rsync 做到这一点。我试过
rsync -a --link-dest=$DATA $DATA $DATA/../upgrade_tmp
Run Code Online (Sandbox Code Playgroud)
但 rsync 不是创建文件的硬链接,而是完全复制它们。使用相同的源和链接目标目录是否有问题?
Ste*_*day 26
rsync 是一个强大的工具,但不幸的是,它对某些路径名非常挑剔。
如果$DATA是绝对路径(即以 a 开头/),则要使用的正确命令行是:
rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp
Run Code Online (Sandbox Code Playgroud)
[现在,只是简要介绍一下它rsync的奇怪之处。请注意/添加到 source 参数的尾随。这告诉rsync使用源目录的内容,而不是源目录本身。(我假设它$DATA尚未包含尾随/。)在这种情况下,我们想要处理内容,因此我们添加尾随/。]
另一方面,如果$DATA是相对路径(即它不以 a 开头/),那么 Sean R 的评论--link-dest是:链接目标路径是相对于目标路径解释的,因此您将使用以下内容:
rsync -a --link-dest=../`basename $DATA` $DATA/ $DATA/../upgrade_tmp
Run Code Online (Sandbox Code Playgroud)
编辑
最后一点,事实证明,rsync无论是否$DATA是绝对路径,我给出的第二个命令行都应该可以工作,因为basename不关心路径是绝对路径还是相对路径。
Sea*_*der 18
你想要的是“cp -al”:
cp -al $DATA/ $DATA/../upgrade_tmp/
Run Code Online (Sandbox Code Playgroud)
rsync -a事实证明,rsync与其他工具相比,使用它更难做到这一点。的正确答案rsync是 Steven Monai 的,但最简单的方法是在以下系统中使用cp -al或不是有效选项的系统:pax -rwl-lcp
pax -rwl $DATA $DATA/../upgrade_tmp
Run Code Online (Sandbox Code Playgroud)
或者
cp -al $DATA/ $DATA/../upgrade_tmp/
Run Code Online (Sandbox Code Playgroud)
该--link-dest选件rsync是相对于目标目录,而不是当前目录。所以你想要的是:
rsync -a --link-dest=../`basename $DATA` $DATA $DATA/../upgrade_tmp
Run Code Online (Sandbox Code Playgroud)