在mac文件系统中可以对一个文件进行标题中的这5种操作,操作的结果都是生成一份副本,但是其中却有很大区别。
首先操作上的区别很明显
- 生成 软连接、硬连接 是通过命令行操作的
- 生成 替身、复制、拷贝 一般是通过finder进行操作的,右键某个文件,菜单中选择(其实复制也可以用命令cp来实现,跟finder操作是一个效果)
然后其中的 复制和拷贝 跟另外三种方式本质上不同,它们之间的区别也很好理解
- 他们的共同点是生成一份文件的副本,副本和原文件是两个独立的文件,两者的关系只有在生成时是关联的,在生成之后两者就没有关系,一个的被修改完全不会影响到另一个
- 区别是在你右键点击复制后就会立刻在当前目录下生成一份副本,而拷贝则是把此文件的副本放到剪贴板,等待被粘贴
软连接和硬连接
但 软连接、硬连接、替身 间的区别就需要进一步分析。
它们本质上都不会生成文件的副本,而是通过各种方式去指向原文件,让你可以跟访问原文件一样访问连接或是替身。
这里先分析软连接(或者说符号链接 symbolic link)和硬连接(hard link),它们都是在「POSIX」标准中就有的,所以在Linux和macOS上都会有,而且也是一样的。
他们的作用有:
- 让用户更方便的访问到文件、目录、驱动器或者网络设备等文件系统对象
- 当用户访问一个具有很深目录结构的文件时,不用再一级一级的打开目录,而是直接双击链接,就打开了相应的文件
- Linux 中常用它来解决一些库版本的问题
- 多数情况下,通过链接访问原始对象的过程对用户和应用程序是透明的,不可见的
从使用的角度讲,两者没有任何区别,都与正常的文件访问方式一样,支持读写,如果是可执行文件的话也可以直接执行。区别在于底层原理:软连接本身是一个文件,类似Windows 的快捷方式,可以让你通过连接文件到原文件;硬连接是通过文件系统的inode连接来产生新文件名,跟访问原文件一样进行访问,中间不会产生新文件,下面举个例子详细说明。
我们先以文件为例(目录稍有不同),在一个目录中创建一个文件和它的软硬连接
(注:因为涉及一些linux系统有关的讨论,本文中一律使用「目录」这个名称代替「文件夹」)
$ touch myfile && echo "my file first line" > myfile
$ ln myfile hard # 创建一个硬连接文件hard
$ ln -s myfile soft # 创建一个软连接文件soft
首先,我们会发现,通过软连接、硬连接和文件本身myfile对「文件内容」进行操作的效果都是一样的,实际上都是操作myfile
$ echo "new line by hard" >> hard
$ cat myfile
my file first line
new line by hard
$ echo "new line by soft" >> soft
$ cat myfile
my file first line
new line by hard
new line by soft
但如果我们我们对文件本身进程操作,对软连接和硬连接的影响就不太一样了
删除 myfile 文件,然后分别输出软硬链接的文件内容,你会发现软连接会找不到文件,但硬连接却能正常访问
$ rm myfile
$ cat hard
my file first line
new line by hard
new line by soft
$ cat soft
cat: soft: No such file or directory
# 先查看下现在目录的状态
$ ls -lhi
87446916 -rw-r--r--