![rsync --link-dest 无法按预期使用符号链接](https://linux22.com/image/9155/rsync%20--link-dest%20%E6%97%A0%E6%B3%95%E6%8C%89%E9%A2%84%E6%9C%9F%E4%BD%BF%E7%94%A8%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5.png)
我用来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
下面的代码通常会创建一个到符号链接的硬链接,甚至在ln
macOS 的手册中也有记录(编辑:不,不是,除非你安装了 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 个)的符号链接:slink
hlink
stat
hlink
$ 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
选项告诉它复制符号链接指向目标的文件。如果您尝试构建源目录的完整副本,这将很有用(但如果您的目标是减少磁盘使用量,则不是很有用)。