有时,我必须对服务器上的数据文件执行几项大型迁移更改,我正在寻找一种好的方法来实现这一点。我考虑使用 rsync 从根数据文件夹开始复制目录结构,创建指向所有原始文件的硬链接(其中一些文件相当大),然后我可以在目标树中仅覆盖需要迁移的文件。最后,我可以通过两个mv
操作安全地从旧文件切换到新文件。
但是,我似乎无法让 rsync 做到这一点。我试过
rsync -a --link-dest=$DATA $DATA $DATA/../upgrade_tmp
但是 rsync 不会创建文件的硬链接,而是会完全复制它们。使用相同的源和链接目标目录是否存在问题?
答案1
rsync
是一个强大的工具,但不幸的是,它对某些路径名非常挑剔。
如果$DATA
是绝对路径(即以 开头/
),则正确的命令行是:
rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp
[现在,简单说一下 的奇怪之处。请注意添加到源参数的rsync
尾部。这告诉要使用/
rsync
内容源目录,而不是源目录本身。 (我假设它$DATA
不包含尾随的/
.)在本例中,我们想要处理内容,因此我们添加尾随的/
.]
另一方面,如果$DATA
是相对路径(即它不以 开头/
),那么 Sean R 的评论--link-dest
是正确的:link-dest 路径是相对于目的地路径,因此您可以使用以下命令:
rsync -a --link-dest=../`basename $DATA` $DATA/ $DATA/../upgrade_tmp
编辑
最后要注意的是,事实证明,rsync
我给出的第二个命令行无论是否$DATA
是绝对路径都应该起作用,因为basename
它不关心路径是绝对路径还是相对路径。
答案2
你想要的是“cp -al”:
cp -al $DATA/ $DATA/../upgrade_tmp/
- -a 递归如下
rsync -a
- -l 将硬链接文件而不是复制它们。
答案3
事实证明,使用 比使用其他工具更难做到这一点rsync
。 的正确答案rsync
是 Steven Monai 的,但最简单的方法是在不是有效选项的系统上使用cp -al
或:pax -rwl
-l
cp
pax -rwl $DATA $DATA/../upgrade_tmp
或者
cp -al $DATA/ $DATA/../upgrade_tmp/
答案4
这个对我有用:
$ rsync --hard-links --recursive --link-dest=/local user@host:/remote/ /local
我使用 rsync 版本 3.1.0。
从男人:
--硬链接
告诉 rsync 在传输中查找硬链接文件,如果没有这个选项,传输中的硬链接文件将被视为单独的文件。
–link-dest=目录
未更改的文件从 DIR 硬链接到目标目录。文件的所有保留属性(例如权限、可能的所有权)必须相同,才能将文件链接在一起