rsync --link-dest 无法按预期使用符号链接

rsync --link-dest 无法按预期使用符号链接

我用来rsync备份我的一些文件:

rsync -aEN --delete --link-dest="$CURR/" "$SOURCE/" "$NEW/"

--link-dest选项适用于大多数文件,但不适用于符号链接。
当我为旧备份编写清理脚本时,我注意到未更改的符号链接不是硬链接,而是复制的。

现在我想知道:
有没有办法使rsync硬链接不变的符号链接?
如果不是:这是故意的还是 rsync 中的错误?

我在 Mac OS 10.11 上使用 rsync 版本 3.1.1。

编辑:

这似乎是 Mac OS X 中的一个问题。出于某种原因,HFS+ 似乎不支持符号链接的硬链接。

答案1

macOS (HFS+) 上的文件系统不支持到符号链接的硬链接:

$ touch file
$ ls -l file
-rw-r--r-- 1 kk staff 0 Jun 17 18:35 file

$ ln -s file slink
$ ls -l file slink
-rw-r--r-- 1 kk staff 0 Jun 17 18:35 file
lrwxr-xr-x 1 kk staff 4 Jun 17 18:36 slink -> file

下面的代码通常会创建一个到符号链接的硬链接,甚至在lnmacOS 的手册中也有记录(编辑:不,不是,除非你安装了 GNU coreutils 并阅读了错误的手册,哦!):

$ ln -P slink hlink
$ ls -l file slink hlink
-rw-r--r-- 1 kk staff 0 Jun 17 18:35 file
lrwxr-xr-x 1 kk staff 4 Jun 17 18:38 hlink -> file
lrwxr-xr-x 1 kk staff 4 Jun 17 18:36 slink -> file

您可以通过引用计数 (1) 看到没有为其创建新名称(如果有效的话,两者slink都为 2 )。另外,告诉我们这是一个带有 1 个 inode 链接(而不是 2 个)的符号链接:slinkhlinkstathlink

$ stat hlink
  File: 'hlink' -> 'file'
  Size: 4               Blocks: 8          IO Block: 4096   symbolic link
Device: 1000004h/16777220d      Inode: 83828644    Links: 1
Access: (0755/lrwxr-xr-x)  Uid: (  501/      kk)   Gid: (   20/   staff)
Access: 2016-06-17 18:38:18.000000000 +0200
Modify: 2016-06-17 18:38:18.000000000 +0200
Change: 2016-06-17 18:38:18.000000000 +0200
 Birth: 2016-06-17 18:38:18.000000000 +0200

/bin/ln编辑:由于我被发现使用 GNU coreutils,这里再次在 macOS 上进行测试:

$ touch file
$ /bin/ln -s file slink
$ /bin/ln slink hlink   # there is no option corresponding to GNU's -P
$ ls -l file slink hlink
-rw-r--r--  2 kk  staff  0 Jun 17 18:59 file
-rw-r--r--  2 kk  staff  0 Jun 17 18:59 hlink
lrwxr-xr-x  1 kk  staff  4 Jun 17 18:59 slink -> file

硬链接指向file而不是指向slink

在例如 Linux 和 OpenBSD(我使用的其他操作系统)上,可以这样做,这会导致

$ ls -l file slink hlink
-rw-rw-r-- 1 kk kk 0 Jun 17 18:35 file
lrwxrwxrwx 2 kk kk 4 Jun 17 18:43 hlink -> file
lrwxrwxrwx 2 kk kk 4 Jun 17 18:43 slink -> file

(注意“2”)

答案2

您不能对符号链接建立硬链接(这不是 OS X 的“限制”)。硬链接是对 inode 的引用,符号链接不是 inode,而只是目录中的一个条目,带有一些附加信息。

您可能会想到 Windows,它具有类似的功能,但行为不同。

rsync 有一个--copy-links选项告诉它复制符号链接指向目标的文件。如果您尝试构建源目录的完整副本,这将很有用(但如果您的目标是减少磁盘使用量,则不是很有用)。

相关内容