63

如何在 Mac OS X 中创建指向目录的硬链接?

此功能已在Mac OS X v10.5 (Leopard)(用于时间机器)中添加到他们的文件系统中,但我找不到任何有关从命令行实际使用它的信息。

4

4 回答 4

86

如果有人感兴趣,我已将建议的答案捆绑在 Git 存储库中:https ://github.com/selkhateeb/hardlink

安装后,创建一个硬链接:

hln source destination

我还注意到该unlink命令在 Mac OS X v10.6 (Snow Leopard) 上不起作用,所以我添加了一个取消链接的选项:

hln -u destination

要安装 Hardlink,请使用Homebrew并运行:

brew install hardlink-osx
于 2011-02-25T14:56:45.080 回答
74

不幸的是,苹果削弱了这个ln命令。您可以使用以下程序创建指向目录的硬链接:

#include <unistd.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
 if (argc != 3) {
  fprintf(stderr,"Use: hlink <src_dir> <target_dir>\n");
  return 1;
 }
 int ret = link(argv[1],argv[2]);
 if (ret != 0)
  perror("link");
 return ret;
}

考虑到硬链接目录可能不在同一个父目录中,因此您可以这样做:

$ gcc hlink.c -o hlink
$ mkdir child1
$ mkdir parent
$ ./hlink child1 parent/clone2
于 2009-10-10T11:32:58.760 回答
17

在 the_undefined 关于如何删除指向目录的硬链接而不删除与其链接的其他目录的内容的问题的答案中:据我所知,无法使用内置命令从命令行完成. 然而,这个小程序(灵感来自 Freeman 的帖子)会做到:

#include <unistd.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
    if (argc != 2) {
        fprintf(stderr,"Use: hunlink <dir>\n");
        return 1;
    }
    int ret = unlink(argv[1]);
    if (ret != 0)
        perror("unlink");
    return ret;
}

继续弗里曼的例子,

$ gcc hunlink.c -o hunlink
$ echo "foo bar" > child1/baz.txt
$ ./hunlink parent/clone2

将删除 parent/clone2 处的硬链接,但保留目录child1和文件child1/baz.txt

于 2010-03-13T21:36:38.707 回答
12

另一种解决方案是使用可通过端口安装的 bindfs https://code.google.com/p/bindfs/ :

sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir
于 2013-02-12T21:41:45.030 回答