在 OS X 中创建目录硬链接的 Unix 命令是什么?

2024-02-04

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


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

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

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

因此,雪豹已经失去了创建硬链接的能力是完全不正确的 文件夹。

我刚刚验证了链接/取消链接在 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”的 inode 号 - 请记住命令的格式是

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 实用程序 https://web.archive.org/web/20200910033812/https://osxbook.com/blog/2008/11/09/hfsdebug-40-and-new-hfs-features/。这是一个非常有趣的软件,会告诉您许多有关 HFS+ 文件系统的详细信息。它是免费的,我鼓励您下载并尝试一下。它不再受支持,但仍然适用于 Snow Leopard 和 Leopard - 基本上任何 HFS+ 支持的系统。你不能用它真正造成任何伤害,因为它是一个“只读”工具 - 所以它非常适合用来查看文件系统的一些细节。

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

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

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

如果您使用 NFS 挂载远程客户端(并假设系统上有一个 NFS 服务器,且该卷具有本地 HFS+ 文件系统),则似乎不会出现这些问题(错误消息除外)。这里不详细介绍如何使用 NFS 挂载卷。我使用了 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 的这个有趣方面,我希望您能玩得开心。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 OS X 中创建目录硬链接的 Unix 命令是什么? 的相关文章

  • 如何制作一个 bash 脚本来同时创建 40 个程序实例?

    我是新来的bash and Linux 我编写了一个程序 我想创建多个同时实例 现在 我通过打开 10 个新终端 然后运行该程序 10 次 我运行的命令是php home calculatedata php 使用 bash 脚本执行此操作的
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • `pyqt5'错误`元数据生成失败`

    我正在尝试安装pyqt5使用带有 M1 芯片和 Python 3 9 12 的 mac 操作系统 我怀疑M1芯片可能是原因 我收到一个错误metadata generation failed 最小工作示例 directly in the t
  • 获取 Mojave 上的鼠标坐标

    我有一个非常基本的小命令行应用程序 可以在下次单击鼠标时获取鼠标坐标 import
  • “pdo_mysql”已禁用,我无法启用它。我在 iMac 7.1 OSX 10.6.8 上安装了 MAMP v. 3.0.4

    pdo mysql 已禁用 我无法启用它 我在 iMac 7 1 OSX 10 6 8 上安装了 MAMP v 3 0 4 在我的 phpinfo 页面上 我可以看到唯一启用的 PDO 是 sqlite 如果我查看 php 5 5 10 扩
  • 使用 FileInputStream 时如何确定理想的缓冲区大小?

    我有一个从文件创建 MessageDigest 哈希 的方法 我需要对很多文件 gt 100 000 执行此操作 用于读取文件的缓冲区应该设置多大才能最大限度地提高性能 大多数人都熟悉基本代码 为了以防万一 我将在这里重复一遍 Messag
  • 无法连接到 macOS 上的 Docker 守护进程

    我通常更喜欢使用brew 来管理我的OSX 上的应用程序 我能够安装 docker docker compose 和 docker machine docker version Docker version 17 05 0 ce build
  • 匹配模式后添加行[重复]

    这个问题在这里已经有答案了 我有一个文件说test具有以下值 Linux Solaris Fedora Ubuntu AIX HPUX 如何在匹配 AIX 的行后面添加一行系统主机名 如果我做 echo hostname gt gt tes
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 超类与类SpecificationPolicy不匹配

    我得到了一个superclass mismatch for class SpecificationPolicy尝试安装或升级某些brew 软件包时出错 例如 更新安装 supabase CLI 时 brew install supabase
  • 有没有办法让我简化这些回声? [复制]

    这个问题在这里已经有答案了 我仍在学习如何编写 shell 脚本 并且我面临着一个挑战 让我更容易回显 Name1 Name2 Name15 我不太确定从哪里开始 我已经想法 但如果我搞砸了 我不想看起来很傻 有什么帮助吗 我实际上还没有尝
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • Git 2.2.x 无缘无故更新旧包文件的时间戳

    Git 2 2 0 和 2 2 1 似乎修改了旧的时间戳 git objects pack pack pack偶尔会无缘无故地文件 它只是改变时间戳 内容是相同的 调试这一点很困难 因为它似乎很少进行更改 我在 2 2 0 之前的任何 Gi
  • 我可以在没有 Hadoop 的情况下使用 Spark 作为开发环境吗?

    我对大数据和相关领域的概念非常陌生 如果我犯了一些错误或拼写错误 我很抱歉 我想了解阿帕奇火花 http spark apache org 并使用它仅在我的电脑中 在开发 测试环境中 由于Hadoop包含HDFS Hadoop分布式文件系统
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • 在 bash 脚本中提取 XML 值 [重复]

    这个问题在这里已经有答案了 我正在尝试从 xml 文档中提取一个值 该文档已作为变量读入我的脚本中 原始变量 data is
  • 从 UNIX 命令行向串行端口发送字节?

    我想使用命令行将字节流发送到串行端口 这可能吗 我的串口位于 dev cu usbserial A700dYoR在我的 Mac 上 例如 如果我想将整数 50 或字符串 data 发送到该串行端口 我该怎么做 我对 UNIX 的了解非常有限
  • 使用 su 和 Expect 脚本登录用户时遇到问题

    我正在为一个班级制作一个网站 您可以使用用户名和密码登录 然后它会将您带到一个显示您在班级中的成绩的页面 该网站正在运行bash脚本 https github com jduga002 rapache 并将托管在用户已有用户名和密码登录的计
  • 协助 awk/bash 捕获内存差异

    我正在尝试从以下文件中提取以下输出 xr lab show clock Thu Sep 19 14 38 02 812 WIB 14 38 02 893 WIB Thu Sep 19 2019 xr lab xr lab xr lab sh
  • 在bash脚本中分割字符串[重复]

    这个问题在这里已经有答案了 我想分割一个字符串并需要其中的一些参数 USER dn uid dfl3030 cn users cn accounts dc tenant dc ycs dc io cn Reb Lena Schmidt kr

随机推荐