macOS 中文件的软链接、硬链接

最近有这么个需求,由于我在多台设备上使用 Surge ,因此我想把 Surge 的配置文件使用 Dropbox 进行同步,但是 Dropbox 的路径在 ~/User/slark/Dropbox/surge.conf 下,而 Surge 的配置文件位于 ~/.surge.conf,每次修改 .surge.conf 后,我都会手动把文件另存到 Dropbox 中,比较麻烦。

开始想用一款本地文件同步工具来满足这个需求,比如 GoodSync,这个工具也确实能满足需求,但是就这么小的需求也要用软件来实现?经过 Google 后,发现可以通过创建文件的 硬链接 来完美满足这个需求。

文件的 软链接 和 硬链接

在 Unix 系统中,可以对文件创建 硬链接软链接。简单来说,链接就是可以指向文件系统中其他位置的一个快捷方式,比如 Windows 系统下的快捷方式。那么,硬链接和软链接有什么区别呢?

硬链接

硬链接是一个目录条目,它指具有同一个 i-node(硬盘上的物理位置)的另一个文件,事实上只存在一个文件,比如我对 Dropbox 中的 surge.conf 文件创建一个硬链接:

格式:ln [原文件] [硬链接文件]
ln ~/Dropbox/surge.conf ~/.surge.conf

原文件和硬链接的详细信息对比:

硬链接有这么几个特点:

  • 文件的所有的硬链接指向的是同一个文件,硬盘中只实际只存储一份文件;
  • 所有硬链接与原文件的大小,修改时间,权限都相同;

因为是硬链接,所以 ~/Dropbox/surge.conf~/.surge.conf 指向的是同一个文件,删除任何一个链接都不会真正的删除文件。

可以这么理解,在 Unix 系统下,任何文件的实际路径都是一个硬链接,该文件的硬链接数为 1,每创建一个硬链接后,硬链接数 +1,删除一个硬链接,硬链接数 -1,硬链接数为 0 时这个文件实际就被删除了。好比程序中的指针,实际的对象只有一份,指向这个对象的指针却有多个,删除任何一个指针并不会删除这个对象,只有把最后一个指针删掉,这个对象才算是删除掉了。

软链接

软链接则和 windows 中的快捷方式类似,是一个独立的文件,其中包含了指向一个位置的指针,使用如下命令可以创建一个软链接:

格式:ln -s [原文件] [软链接文件]
ln -s .surge.conf mac_surge.conf

原文件和软链接的详细信息对比:

因为是软链接,删除原文件,所有的软链接都会失效,修改软链接并不会影响原文件,仅仅修改的是该软链接指向的位置而已。

关于文件链接使用的选择

基于上面的介绍,我的需求就只有硬链接可以满足了,修改一处,每处都会发生变化。硬链接用于原始文件和目标文件位于当前同一个文件系统。好处是能提供真实文件的有关信息,在原始文件被删除或移动时,也不会成为空链接。但是,如果需要连接目录或位于另一个文件系统的文件时,就必须采用软链接。