有时,我不得不在我的服务器上的数据文件上执行一些大的迁移更改,我正在寻找一个很好的方法来做到这一点。 我正在考虑使用rsync从根数据文件夹开始复制我的目录结构,创build所有原始文件的硬链接(其中一些文件比较大),而且只能在目标树中覆盖需要迁移的文件。 最后,我可以安全地从两个mv
操作从旧文件切换到新文件。
但是,我似乎无法得到rsync来做到这一点。 我试过了
rsync -a --link-dest=$DATA $DATA $DATA/../upgrade_tmp
但不是创build文件的硬链接,rsync完全复制它们。 使用相同的源和链接目录目录是否有问题?
rsync
是一个强大的工具,但不幸的是,它的一些path名称很奇怪。
如果$DATA
是绝对path(即以/
开始),那么使用正确的命令行是:
rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp
[现在,简单的说一下rsync
的奇怪。 注意尾部/
添加到源参数。 这告诉rsync
使用源目录的内容 ,而不是使用源目录本身。 (我假设$DATA
还没有包含尾部/
。)在这种情况下,我们要处理的内容,所以我们添加尾部/
。]
另一方面,如果$DATA
是一个相对path(即它不以a开始),那么Sean R关于--link-dest
的注释--link-dest
被--link-dest
:link-destpath被解释为相对于目标path,所以你会使用以下内容:
rsync -a --link-dest=../`basename $DATA` $DATA/ $DATA/../upgrade_tmp
编辑
最后一点,事实certificate,我给出的第二个rsync
命令行应该工作,不pipe$DATA
是否是绝对path,因为basename
不关心path是绝对path还是相对path。
你想要的是“cp -al”:
cp -al $DATA/ $DATA/../upgrade_tmp/
rsync -a
一样recursion rsync
的--link-dest
选项相对于目标目录而不是当前目录。 所以你想要的是:
rsync -a --link-dest=../`basename $DATA` $DATA $DATA/../upgrade_tmp
事实certificate,使用rsync
比使用其他工具更困难。 rsync
的正确答案是Steven Monai's,但最简单的方法是在系统上使用cp -al
或pax -rwl
,其中-l
不是cp
的有效选项:
pax -rwl $DATA $DATA/../upgrade_tmp
要么
cp -al $DATA/ $DATA/../upgrade_tmp/
它适用于我:
$ rsync --hard-links --recursive --link-dest=/local user@host:/remote/ /local
我使用rsync版本3.1.0。
从男人 :
-硬链接
告诉rsync在传输中查找硬链接的文件,如果没有这个选项,传输中的硬链接文件将被视为单独的文件。
–link-DEST = DIR
未更改的文件从DIR链接到目标目录。 这些文件必须在所有保留的属性(例如,权限,可能的所有权)中是相同的,以便将文件链接在一起
首先仅在目标上创build目录:
rsync -av --include '*/' --exclude '*' /source/ /destination/
然后只硬连接文件:
cd /source find . -type f -exec ln -v {} /destination/{} \;
使用选项-H保存硬链接并阅读联机帮助页。