如何创建一个硬连接(而不是一个符号或一个Mac OS别名)在OS X指向的目录? 我已经知道命令“LN目标目的地”,但只有当目标是一个文件工作。 我知道的Mac OS,不像其他的Unix环境,确实允许hardlinking到文件夹(这是用于时间机器,例如),但我不知道该怎么做我自己。
Answer 1:
我同意,硬链接文件夹/目录可如果不小心造成的问题,但他们有一个非常明确的优势 - 时间机器是一个很好的例子。 没有他们,它根本不会像文件,即使将很快消耗最大的磁盘的冗余版本的重复实用。
只要你按照阿米特·辛格的六个规则雪豹可以创建硬链接的目录:
- 该文件系统必须轴颈HFS +。
- 源和目标的父目录必须是不同的。
- 该人士的父母一定不能是根目录。
- 目标不能在根目录下。
- 该目标不得是源的后裔。
- 目标不能有,这是一个目录硬链接的任何祖先。
因此,这不是正确的,在所有的雪豹已经失去了创建硬链接到文件夹的能力。
我只是验证链接/取消链接在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+超神奇的超级隐藏文件私人目录数据%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中去这一切努力为这个硬链接创建文件夹? 是否有事可做的事实,这是一个“轴颈”文件系统?
我通过阅读他的“hfsdebug”实用的阿米特·辛格的解释发现关于超级神奇,超级隐藏位置的信息。 如果您想了解更多详情,请参见他的网站阿米特·辛格的hfsdebug效用 。 这是一个非常有趣的软件,并会告诉你许多关于HFS +文件系统的详细信息。 它是免费的,我鼓励你去下载它,并尝试一下。 它不再支持,但它仍然工程上都雪豹和Leopard的 - 基本上任何HFS +支持的系统。 你真的不能做任何伤害它,因为它是一个“只读”的工具 - 因此它是伟大的,用它来查看文件系统的一些细节。
这些“硬链接到文件夹”还有一个问题 - 一旦你创建一个超级神奇的超级秘密隐藏文件被创建,它的存在为好。 即使如果取消,导致它在第一时间被创建的文件夹,这个文件夹魔术周围停留。 不知道为什么,但它绝对不会。 如果你想尝试一下,你可以用“hfsdebug”发现了这一点。 您还可以使用“hfsdebug”找出有多少这样的“硬链接的文件夹”的驱动器上存在。 对于这些详见Amit的文章对“hfsdebug”实用工具。
他也有支持的功能,但成本的另一个较新的工具。 这就是所谓的fileXray和成本,一人79 $任意数量在同一家庭电脑用于个人非商业类型的许可证。 它具有广泛的173页的用户指南,您可以下载来看看你在购买之前可以做。 不幸的是没有试用版,让阅读手册,并检查了网站了解更多详情,看看它是否能帮助你走出困境的。 了解所有关于它的细节在其网站-见fileXray网站获取更多信息。
有一对夫妇的问题,您应该意识到使用这些硬链接到文件夹时的感觉。 如果其创建的卷安装到远程客户端,可以有显著的问题,这取决于它们是如何安装。 如果您使用AFP的卷安装到远程客户端,也有很大的问题,目前有一个硬链接,或有过一个,但后来删除任何文件夹,将无法使用,因为所有的下级文件夹(但没有文件)会无论从Finder或终端窗口无法访问。 对所有下级文件夹中的错误消息如果试图做一个简单的“ls -lR”命令,它会失败,并给你“没有这样的文件或目录LS:XXX”。 如果您使用Finder窗口遍历远程卷的目录树,这是有或具有硬链接到它没有任何错误将完全消失,当你第一次点击文件夹名称的文件夹中的文件夹。
这些问题似乎并没有出现(除了错误消息)如果你使用NFS挂载远程客户端(假设你有一个具有体积为本地HFS +文件系统的系统上的NFS服务器)。 这里不提供关于如何使用NFS挂载卷的详细信息。 我用了一个很好的计划,从马塞尔Bresink博士称为“NFS管理器”,以帮助在服务器和客户端上的NFS挂载。 你可以从他的网站得到它 - 只要搜索你喜欢的搜索引擎“Bresink NFS管理器”,但他有一个免费试用版本,所以你可以先试后买。 这不是什么大不了的事,如果你想学习如何做NFS挂载,但“NFS管理器”使得它很容易设置的东西,并调整所有不同的设置,以帮助优化。 他还有其他几个整齐的Mac OS X实用工具也被非常合理的价格 - 一个被称为“硬件监控”,让您监视和图形的各种事情像电力使用,CPU温度,风扇和许多许多其他变量都速度在延长的时间周期中的本地和远程Mac系统(从几分钟到几天)。 绝对值得一试,如果你是为方便的工具。
有一两件事我注意到的是,NFS文件传输比通过AFP做他们慢约20%,但你的“里程可能会有所不同”,所以没有保证的一种方式或其他,但我宁愿有一些即使我有工作支付20%的性能损失相比,有什么都没有工作的。
苹果公司意识到与硬链接和远程文件系统AFP的问题,他们称其为AFP客户端的“implentation限制” - 我更喜欢叫它什么是真正在我看来是 - 一个BUG! 我只能希望的Mac OS X的下一个版本解决了这个问题,因为我真的很喜欢不必使用硬链接到文件夹时,它是有道理的能力。
这些笔记是我自己个人的看法,我不会就其正确性任何保证您自己的风险,从而使用它们。 有一个良好的备份你玩弄这些“硬链接到文件夹”以防万一意外发生之前。 但我希望你玩得开心,如果你决定看起来有点更于Mac OS X的这个有趣的方面
Answer 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
Answer 3:
废话。 在10.5,它会告诉你在ln命令的手册页:
-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
那里。 希望你不要破坏你的文件系统!
Answer 4:
跨发布这个伟大的工具,它巧妙地解决了这个问题,原帖由山姆 :
要安装硬连接,确保你已经安装自制软件 ,然后运行:
brew install hardlink-osx
一旦安装,创建一个硬链接:
hln [source] [destination]
我还注意到, unlink
命令不能在雪豹工作,所以我增加了一个选项,以取消链接:
hln -u destination
代码可在Github上为那些有兴趣谁: https://github.com/selkhateeb/hardlink
Answer 5:
是的,它由内核和文件系统的支持,但因为它不是用于一般用途它不会暴露在外壳。
你也许可以找出哪些API时间机器使用,并在一个命令行工具将它们包装,但是最好能够采取暗示,引导好清晰。
Answer 6:
的OSX版本ln
不能做到这一点,但是,在通过对方的回答中提到丰富 ,可以与GNU版本的ln
这是可用自制的gln
作为一部分的coreutils公式。 man gln
列出了-d
在所提供的OSX,特定的警告选项丰富的答案。 换句话说,它并不适用于所有情况。 究竟确定它是否工作与否似乎并不被记录任何地方。
作为先决条件,安装coreutils
:
brew install coreutils
现在,你可以这样做:
sudo gln -d /original_folder /mirror_folder
重要提示 :要删除您必须使用硬链接gunlink
:
sudo gunlink /mirror_folder
使用rm
或Finder也将删除原来的文件夹。
FYI:该coreutils的自制配方提供一些通用UNIX工具的GNU兼容版本。 使用brew list coreutils
看到的完整列表。
Answer 7:
我的情况是,我发现,从Windows虚拟机,我不能跟随符号连接。 (我想测试在Internet Explorer中的某些HTML页)。 而我的目录结构进行了CSS和图像文件夹的符号链接。
我的解决方法来解决这个问题比暗示其他答案了不同的方法。 我用rsync
创建文件夹的副本。 rsync的可以解决的符号连接和代替复制链接的文件。
这解决了我的问题,而无需使用硬链接的目录。 它实际上是一个简单的解决方案,如果你只是一个小的文件集的工作。
rsync -av --copy-dirlinks --delete ../htmlguide ~/src/
Answer 8:
截至2018不再可能。 有源电力滤波器(在MacOS上高塞拉利昂10.13推出),不符合目录的硬链接兼容。 见https://github.com/selkhateeb/hardlink/issues/31
Answer 9:
简短的回答是你不能。 :)(可能除了为根,当它会更准确的说,你不应该。)
Unix系统只允许链接目录的一组数字 - “”从内的所有儿童和“” 从内部本身。 还有什么是潜在的非常困惑目录树的配方。 这是/显然是由Ken Thompson设计决定。
(说到这,显然是苹果的Time Machine没有做到这一点:))
Answer 10:
与吸烟有关的文章,如果您尝试创建在同一目录与原始的硬链接,你会得到错误。 你必须到别的地方创建它。
Answer 11:
这也有不编译什么方法可以内置在Perl(航站楼)。 我的具体使用情况是谷歌硬盘(不支持符号链接),所以下面的例子反映的使用情况。
要连结您的“文档”文件夹,谷歌云端硬盘,它的同步:
perl -e 'link "/Users/me/Documents", "/Users/me/Google Drive/Documents"'
要删除链接到谷歌从云端硬碟的“文档”文件夹:
sudo perl -U -e 'unlink "/Users/me/Google Drive/Documents"'
你需要“根”,即可取消(请参阅“断开连接”的perldoc)。
Answer 12:
另一个解决方案是使用bindfs https://code.google.com/p/bindfs/经由端口是可安装的:
sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir
Answer 13:
如果没有子文件夹,你可以试试
LN FOLDER_PATH / *。 * TARGET_FOLDER
它为我工作在OSX 10.9
Answer 14:
在Linux中,您可以使用绑定安装来模拟硬链接的目录。 不知道OSX
sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
sudo umount /else/dummy_but_existing_directory