【问题标题】:Creating directory hard links in Mac OS X [duplicate]在 Mac OS X 中创建目录硬链接 [重复]
【发布时间】:2010-11-28 18:52:42
【问题描述】:

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

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

【问题讨论】:

  • 如果您对如何从命令行以用户身份访问此功能感兴趣,则应该在 SuperUser 上。如果您想以编程方式进行操作,那就另当别论了:-)

标签: macos hardlink


【解决方案1】:

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

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

hln source destination

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

hln -u destination

要安装硬链接,请使用Homebrew 并运行:

brew install hardlink-osx

【讨论】:

  • 谢谢。为我工作。但是你应该添加 Jean-Philippe Pellet 评论做 README。
  • 值得注意的是,现在 Homebrew. brew install hardlink-osx
  • 感谢@AmirAbiri,已添加
  • 我注意到了一些有趣的事情。这种链接方法与普通的 Unix/Linux 硬链接完全不同——就删除原始目录而言。 Mac OS X让我删除链接仍然存在的原始目录。
  • Hmmm... 似乎在 macOS 10.14 上我收到错误“不允许操作”,即使使用 sudo
【解决方案2】:

不幸的是,Apple 已经削弱了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

【讨论】:

  • 嘿,我已经使用了一段时间了 - 非常感谢。但是,我注意到如果我删除一个硬链接目录(rm -rf),它也会擦除原始源目录的内容。有意义,因为 rm -rf 遍历目录并逐个文件删除。但是,我希望能够直接删除硬链接。这可能吗?
  • 你试过unlink命令和系统调用吗?
  • 看起来他们已经修复了...在 Snow Leopard 中尝试过,我得到“链接:不允许操作”
  • @taber:确保在与源目录的父目录不同的目录中创建硬链接(例如,在 Freeman 示例中的 parent/ 中)。这是osxbook.com/blog/2008/11/09/hfsdebug-40-and-new-hfs-features 中列出的限制之一
  • “link”和“unlink”调用在 10.13.3 (High Sierra) 上都不起作用,导致“Operation Not Permitted”。
【解决方案3】:

在 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

【讨论】:

  • 我收到了resource busy。硬链接是使用绑定创建的
【解决方案4】:

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

sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir

【讨论】:

  • 这适用于我在 Mojave v10.14.3 上
  • 在 Catalina 上对我不起作用:mkdir aa; mkdir bb; bindfs aa bb 会返回错误(Failed to resolve mount point `bb': No such file or directory ),我加了一个github问题:github.com/mpartel/bindfs/issues/83
  • 它现在可以在 Catalina 上完美运行。 (Thomas 提到的问题已修复)
猜你喜欢
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
相关资源
最近更新 更多