在Mac OS X中创建目录硬链接

Fel*_*fer 56 macos hardlink

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

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

Sam*_*Sam 83

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

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

hln source destination
Run Code Online (Sandbox Code Playgroud)

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

hln -u destination
Run Code Online (Sandbox Code Playgroud)

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

brew install hardlink-osx
Run Code Online (Sandbox Code Playgroud)

  • 嗯...似乎在macOS 10.14上我甚至用`sudo`得到错误"Operation not permitted" (7认同)
  • 值得注意的是,现在这已经出现在[Homebrew]上(https://github.com/Homebrew/homebrew/blob/master/Library/Formula/hardlink-osx.rb).`brew install hardlink-osx` (5认同)
  • 谢谢.为我工作.但你应该添加Jean-Philippe Pellet评论做README. (2认同)

Fre*_*man 70

不幸的是,苹果已经削弱了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;
}
Run Code Online (Sandbox Code Playgroud)

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

$ gcc hlink.c -o hlink
$ mkdir child1
$ mkdir parent
$ ./hlink child1 parent/clone2
Run Code Online (Sandbox Code Playgroud)

  • 看起来他们修补了这个...在Snow Leopard中试过这个并且我得到"链接:操作不被允许" (8认同)
  • @taber:确保在与源目录的父目录不同的目录中创建硬链接(例如,在父/在Freeman的示例中).这是http://osxbook.com/blog/2008/11/09/hfsdebug-40-and-new-hfs-features/中列出的限制之一 (6认同)
  • 嘿,我现在已经使用了一段时间 - 非常感谢.但是,我注意到如果我删除一个硬链接目录(rm -rf),它也会擦除原始源目录的内容.有意义,因为rm -rf遍历dir并逐个文件删除.但是,我希望能够直接删除硬链接.那可能吗? (3认同)
  • 你试过unlink命令和系统调用吗? (3认同)
  • 警告一句,apfs 不支持硬链接,将 hfs+ 转换为 apfs 会擦除所有多链接目录(将它们转换为 0 字节的文件)。 (3认同)
  • “链接”和“取消链接”调用均不适用于10.13.3(High Sierra),从而导致“不允许操作”。 (2认同)

rle*_*ber 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;
}
Run Code Online (Sandbox Code Playgroud)

继续Freeman的例子,

$ gcc hunlink.c -o hunlink
$ echo "foo bar" > child1/baz.txt
$ ./hunlink parent/clone2
Run Code Online (Sandbox Code Playgroud)

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


Kit*_*nde 8

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

sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir
Run Code Online (Sandbox Code Playgroud)