如何在 OS X 中创建指向目录的硬链接(而不是符号链接或 Mac OS 别名)?我已经知道命令“ln target destination”,但仅当目标是文件时才有效。我知道 Mac OS 与其他 Unix 环境不同,确实允许硬链接到文件夹(例如,这用于 Time Machine),但我自己不知道如何做到这一点。

有帮助吗?

解决方案 2

那么你不能直接在 BASH 中执行此操作。然而...我在这里找到了一篇文章讨论如何间接做到这一点: http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html 通过编译一个简单的小 C 程序:

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

int main(int argc, char *argv[])
{
   if (argc != 3) return 1;

   int ret = link(argv[1], argv[2]);

   if (ret != 0) perror("link");

   return ret;
}

...并在 Terminal.app 中构建:

$ gcc -o hlink hlink.c -Wall

其他提示

我同意硬链接文件夹/目录如果不小心可能会导致问题,但它们有一个非常明确的优势 - 时间机器就是一个完美的例子。如果没有它们,它根本就不实用,因为文件的冗余版本的重复甚至会很快消耗最大的磁盘。

只要您遵循 Amit Singh 的六个规则,Snow Leopard 就可以创建目录的硬链接:

  1. 文件系统必须采用 HFS+ 日志记录。
  2. 源目录和目标目录的父目录必须不同。
  3. 源的父目录不能是根目录。
  4. 目标不得位于根目录中。
  5. 目标不能是源的后代。
  6. 目标不得有任何目录硬链接的祖先。

因此,Snow Leopard失去了与文件夹建立硬链接的能力,这是完全不正确的。

我刚刚验证了链接/UNLINK在Snow Leopard上的工作 - 只要您遵守六个规则即可。我刚刚尝试过,它在我的 Snow Leopard 10.6.6 系统上运行良好 - 在启动卷和单独的 USB 外部卷上尝试过,在两种情况下都运行良好。

这是“hunlink.c”程序:

#include <stdio.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
   if (argc != 2)
      return 1;
   int ret = unlink(argv[1]);
   if (ret != 0)
      perror("unlink");
   return ret;
}

gcc -o hunlink hunlink.c

因此,尝试时要小心 - 记住遵循规则并使用 hlink 创建这些硬链接,然后使用 hunlink 删除硬链接。而且,不要忘记记录您以后为您或其他可能需要知道的人所做的事情。

我刚刚了解到这些文件夹的“硬链接”的另一个“陷阱”。当您创建它们时,Mac OS X 的“幕后”确实发生了很多事情。一个非常重要的问题是,您创建链接的文件夹实际上被移动到一个名为 /.HFS+ Private Directory Data%000d/dir_xxx 的超级神奇的超级隐藏文件夹,其中 xxx 是“source_folder”的索引节点号 - 请记住命令的格式是

hlink source_folder target_folder

因此,您必须小心不要在“source_folder”中打开任何文件,因为如果您这样做,它们就会被移动到超级神奇的文件夹中,如果您尝试保存任何更改,您可能会遇到问题到“source_folder”中打开的那些文件。这种情况在我身上发生过几次,直到我明白发生了什么,而且解决方案非常简单。我注意到,您无法再执行“ls -la”命令,而不会在原始“source_folder”中的所有文件夹/目录中出现有趣的错误,但您可以执行“ls”命令,并且一切看起来都很好。

如果您在“磁盘实用程序”程序中运行“验证磁盘”,您会注意到它可能会抱怨并给出“卷位图需要对孤立块进行小修”,这就是创建超级神奇文件夹时发生的情况,并且将“source_folder”移动到它。

如果您确实发现自己处于这种“孤立块”的情况,请首先将更改的文件保存到不在包含“source_folder”树的卷中的其他临时位置,然后使用“磁盘工具”卸载并重新装载包含该文件的卷。 “source_folder”或只是重新启动计算机。然后将您保存到临时位置的文件复制回其原始位置,您就可以恢复正常工作了。这对我有用,所以不能保证这也对你有用。因此,在您拥有良好备份的卷上尝试此操作可能是一个好主意,以防万一。

看起来很奇怪,所有这些开销只是为了创建文件夹硬链接的简单任务而发生的。有谁知道为什么 Mac OS X 会付出如此多的努力来创建文件夹的硬链接?这与这是一个“日志式”文件系统有关吗?

我通过阅读 Amit Singh 对他的“hfsdebug”实用程序的解释,发现了有关超级神奇、超级隐藏位置的信息。如果您想了解更多详细信息,请访问他的网站: Amit Singh 的 hfsdebug 实用程序. 。这是一个非常有趣的软件,会告诉您许多有关 HFS+ 文件系统的详细信息。它是免费的,我鼓励您下载并尝试一下。它不再受支持,但仍然适用于 Snow Leopard 和 Leopard - 基本上任何 HFS+ 支持的系统。你不能用它真正造成任何伤害,因为它是一个“只读”工具 - 所以它非常适合用来查看文件系统的一些细节。

关于这些“文件夹的硬链接”的另一个问题 - 一旦您创建了一个并且超级神奇的超级秘密隐藏文件夹被创建,它就永远存在。即使您取消链接最初创建它的文件夹,这个神奇的文件夹仍然存在。不知道为什么,但确实如此。如果您想尝试一下,可以使用“hfsdebug”来找出答案。您还可以使用“hfsdebug”来查明驱动器上存在多少个“文件夹硬链接”。有关这些详细信息,请参阅 Amit 关于“hfsdebug”实用程序的文章。

他还有另一个受支持但收费的新实用程序。它称为 fileXray,一个人在同一家庭中任意数量的计算机上购买个人非商业类型许可证的费用为 79 美元。它有一份长达 173 页的详细用户指南,您可以在购买之前下载该指南以了解它的功能。不幸的是,没有试用版,因此请阅读手册并查看网站以获取更多详细信息,看看它是否可以帮助您摆脱困境。在他们的网站上了解有关它的所有详细信息 - 请参阅 fileXray 网站 了解更多信息。

使用这些文件夹硬链接时,您应该注意几个问题。如果创建它们的卷安装到远程客户端,则可能会出现严重问题,具体取决于它们的安装方式。如果您使用 AFP 将卷安装到远程客户端,则会出现大问题,因为任何当前具有硬链接或曾经有一个但后来被删除的文件夹将无法用作所有较低级别的文件夹(但文件除外)将无法从 Finder 或终端窗口访问。如果您尝试执行简单的“ls -lR”命令,它将失败并给出“ls:xxx:所有较低级别文件夹都没有此类文件或目录”错误消息。如果您使用 Finder 窗口遍历远程卷的目录树,则当您第一次单击文件夹名称时,具有硬链接的文件夹中的文件夹将消失,不会出现任何错误。

如果您使用 NFS 挂载远程客户端(并假设系统上有一个 NFS 服务器,且该卷具有本地 HFS+ 文件系统),则似乎不会出现这些问题(错误消息除外)。这里不详细介绍如何使用 NFS 挂载卷。我使用了 Dr. 的一个很好的程序。Marcel Bresink 调用“NFS Manager”来帮助在服务器和客户端上安装 NFS。您可以从他的网站上获取它 - 只需在您最喜欢的搜索引擎中搜索“Bresink NFS Manager”,但他有免费试用版,因此您可以在购买前试用。如果您想学习如何进行 NFS 安装,这并不是什么大问题,但“NFS 管理器”使设置和调整所有不同设置以帮助优化它变得非常容易。他还有其他几个简洁的 Mac OS X 实用程序,价格非常合理 - 一个称为“硬件监视器”,可让您监视和绘制各种内容,例如电源使用情况、CPU 温度、风扇速度以及许多其他变量。长时间(从几分钟到几天)本地和远程 Mac 系统。如果您喜欢方便的实用程序,绝对值得一试。

我注意到的一件事是 NFS 文件传输比通过 AFP 慢大约 20%,但你的“里程可能会有所不同”,所以不能保证一种方式或另一种方式,但我宁愿拥有一些可以工作的东西,即使我有与什么都不做相比,付出 20% 的性能损失。

Apple 意识到硬链接和远程 AFP 文件系统的问题,他们将其称为 AFP 客户端的“实现限制” - 我更喜欢称其为我真正看到的那样 - 一个 BUG!我只能希望 Mac OS X 的下一个版本能够解决这个问题,因为我真的很喜欢能够在有意义的情况下使用文件夹的硬链接。

这些注释是我个人的观点,我不对其正确性做出任何保证,因此使用它们的风险由您自行承担。在使用这些“文件夹硬链接”之前,请做好备份,以防发生意外情况。但如果您决定更多地了解 Mac OS X 的这个有趣方面,我希望您能玩得开心。

废话。在 10.5 上,它在手册页中告诉您 :

   -d, -F, --directory
          allow the superuser to attempt to hard link  directories  (note:
          will  probably  fail  due  to  system restrictions, even for the
          superuser)

所以是的:

    sudo  ln  -d  existing_dir  new_hard_link

给它你的密码,然后 你还没有完成. 。你没有记录下来,是吗?你 必须 记录硬链接目录;即使它是单用户计算机。

删除则是另一回事:如果您按照删除目录的常用方法进行操作,您将删除其中的内容。那么你 必须 “取消链接”目录:

    unlink  new_hard_link

那里。希望你不要破坏你的文件系统!

交叉发布 这个很棒的工具 这巧妙地解决了问题,最初由 山姆:


要安装硬链接,请确保您已安装 自制的, ,然后运行:

brew install hardlink-osx

安装后,创建硬链接:

hln [source] [destination]

我还注意到 unlink 命令不适用于雪豹,所以我添加了一个取消链接的选项:

hln -u destination

有兴趣的人可以在 Github 上找到代码: https://github.com/selkhateeb/hardlink

是的,它受到内核和文件系统的支持,但由于它不适合一般用途,因此不会暴露给 shell。

您可能可以找出 Time Machine 使用哪些 API 并将它们包装在命令行工具中,但最好接受提示并清楚地引导。

OSX 版本 ln 不能这样做,但是,正如在另一个答案中提到的 富有的, ,使用 GNU 版本是可能的 ln 可以在 自制的 作为 gln 作为 核心工具 公式。 man gln 列出了 -d 选项中提供了 OSX 特定的警告 富有的的回答。换句话说,它并非在所有情况下都有效。到底是什么决定了它是否有效似乎没有任何记录。

作为先决条件,安装 coreutils:

    brew install coreutils

现在你可以这样做:

    sudo gln -d /original_folder /mirror_folder

重要的:要删除硬链接,您 必须 使用 gunlink:

    sudo gunlink /mirror_folder

使用 rm 或 Finder 也会删除原始文件夹。

供参考:这 核心工具 homebrew Formula 提供通用 UNIX 工具的 GNU 兼容版本。使用 brew list coreutils 查看完整列表。

我的情况是,我发现在 Windows 虚拟机中,我无法跟踪符号链接。(我想在 Internet Explorer 中测试一些 HTML 页面)。我的目录结构有 CSS 和图像文件夹的符号链接。

我解决问题的方法是采用与其他答案所暗示的不同的方法。我用了 rsync 创建文件夹的副本。Rsync 可以解析符号链接并复制链接的文件。

这解决了我的问题,而无需使用目录的硬链接。如果您只处理一小部分文件,这实际上是一个简单的解决方案。

rsync -av --copy-dirlinks --delete ../htmlguide ~/src/

从2018年开始就不可能了。APFS(在 MacOS High Sierra 10.13 中引入)与目录硬链接不兼容。看 https://github.com/selkhateeb/hardlink/issues/31

简短的回答是你不能。:)(除非可能是 root,更准确地说你不应该这样做。)

Unixs仅允许与目录的链接数量 - “ ..”来自所有孩子和“”。从自身内部。其他任何东西都可能导致非常混乱的目录树。这显然是肯·汤普森的设计决定。

(话虽如此,显然苹果的时间机器确实做到了这一点:))

从链接到的文章中,如果您尝试在与原始目录相同的目录中创建硬链接,您将收到该错误。您必须在其他地方创建它。

这也可以使用内置 Perl(从终端)完成,无需编译任何内容。我的具体用例是 Google Drive(不支持符号链接),因此下面的示例反映了该用例。

要将您的“文档”文件夹链接到 Google 云端硬盘以进行同步:

perl -e 'link "/Users/me/Documents", "/Users/me/Google Drive/Documents"'

要从 Google 云端硬盘中删除指向“文档”文件夹的链接,请执行以下操作:

sudo perl -U -e 'unlink "/Users/me/Google Drive/Documents"'

您需要“root”才能取消链接(请参阅“取消链接”perldoc)。

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

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

如果没有子文件夹,你可以尝试

ln 文件夹路径/*.* 目标文件夹

它在 OSX 10.9 上对我有用

在Linux中,您可以使用bind mount来模拟硬链接目录。不确定 OSX

sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
sudo umount /else/dummy_but_existing_directory
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top