Linux 命令之软连接硬连接详解

Posted 爱上口袋的天空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 命令之软连接硬连接详解相关的知识,希望对你有一定的参考价值。

一、软连接

1、创建语法

        ln -s target source

        解释下:

  • ln -s:表示创建一个软连接;
  • target:表示目标文件(夹)【即被指向的文件(夹)】
  • source:表示当前目录的软连接名。【源文件(夹)】

2、具体示例

  • step 1.创建测试文件及文件夹
[root@server6 ~]# mkdir test_chk
[root@server6 ~]# touch test_chk/test.txt 
[root@server6 ~]# echo "hello spark" > test_chk/test.txt 
[root@server6 ~]# cat test_chk/test.txt 
hello spark
[root@server6 ~]# ll
总用量 84
-rw-------.  1 root root  1257 6月  16 01:17 anaconda-ks.cfg
drwxr-xr-x. 25 root root  4096 11月  1 10:28 azkabanJob
-rw-r--r--.  1 root root 67322 11月  4 10:24 azkabanJob.zip
drwxr-xr-x.  4 root root    37 7月  13 11:01 hadoop_temp
-rw-r--r--.  1 root root    54 7月   4 14:11 HelloLinux.txt
drwxr-xr-x.  2 root root    22 11月  4 10:41 test_chk
-rw-r--r--.  1 root root    67 10月  8 15:52 zookeeper.out
[root@server6 ~]# ln -s test_chk/ test_chk_ln
[root@server6 ~]# ll
总用量 84
-rw-------.  1 root root  1257 6月  16 01:17 anaconda-ks.cfg
drwxr-xr-x. 25 root root  4096 11月  1 10:28 azkabanJob
-rw-r--r--.  1 root root 67322 11月  4 10:24 azkabanJob.zip
drwxr-xr-x.  4 root root    37 7月  13 11:01 hadoop_temp
-rw-r--r--.  1 root root    54 7月   4 14:11 HelloLinux.txt
drwxr-xr-x.  2 root root    22 11月  4 10:41 test_chk
lrwxrwxrwx.  1 root root     9 11月  4 10:42 test_chk_ln -> test_chk/
-rw-r--r--.  1 root root    67 10月  8 15:52 zookeeper.out
[root@server6 ~]# cd test_chk_ln/
[root@server6 test_chk_ln]# ll
总用量 4
-rw-r--r--. 1 root root 12 11月  4 10:41 test.txt
[root@server6 test_chk_ln]# cat test.txt 
hello spark
[root@server6 test_chk_ln]# ll
总用量 4
-rw-r--r--. 1 root root 12 11月  4 10:41 test.txt
[root@server6 test_chk_ln]# cat test.txt 
hello spark

3、命令示例解释

执行的命令是: ln -s /storage/lawson/scores scor
其含义就是:将scor指向 /storage/lawson/scores/目录下

这里是当前的scor 指向 /storage/lawson/scores 中。这里显示红色,是因为/storage/lawson/scores这个目录不存在,如果创建该目录,那就可以得到蓝色的显示了。

 

需要注意的是,当前所有目录下的文件都不能重名,因为我之前有一个文件夹是scores,所以这里就简单的命名成了scor

4、软连接的删除

     rm -rf ./test_chk_ln/ 会删除文件夹下的所有内容,但是没有删除这个链接;
  rm -rf ./test_chk_ln 则是仅删除这个软链接,不会删除下面的内容。 

  • 错误示范
[root@server6 test_chk_ln]# cd ..
[root@server6 ~]# ll
总用量 84
-rw-------.  1 root root  1257 6月  16 01:17 anaconda-ks.cfg
drwxr-xr-x. 25 root root  4096 11月  1 10:28 azkabanJob
-rw-r--r--.  1 root root 67322 11月  4 10:24 azkabanJob.zip
drwxr-xr-x.  4 root root    37 7月  13 11:01 hadoop_temp
-rw-r--r--.  1 root root    54 7月   4 14:11 HelloLinux.txt
drwxr-xr-x.  2 root root    22 11月  4 10:41 test_chk
lrwxrwxrwx.  1 root root     9 11月  4 10:42 test_chk_ln -> test_chk/
-rw-r--r--.  1 root root    67 10月  8 15:52 zookeeper.out
[root@server6 ~]# rm -rf ./test_chk_ln/
[root@server6 ~]# ll
总用量 84
-rw-------.  1 root root  1257 6月  16 01:17 anaconda-ks.cfg
drwxr-xr-x. 25 root root  4096 11月  1 10:28 azkabanJob
-rw-r--r--.  1 root root 67322 11月  4 10:24 azkabanJob.zip
drwxr-xr-x.  4 root root    37 7月  13 11:01 hadoop_temp
-rw-r--r--.  1 root root    54 7月   4 14:11 HelloLinux.txt
drwxr-xr-x.  2 root root     6 11月  4 10:42 test_chk
lrwxrwxrwx.  1 root root     9 11月  4 10:42 test_chk_ln -> test_chk/
-rw-r--r--.  1 root root    67 10月  8 15:52 zookeeper.out
[root@server6 ~]# cd test_chk
[root@server6 test_chk]# ll
总用量 0
[root@server6 test_chk]# ll
总用量 0

可以发现该文件夹下的内容都被删了。。。

  • 正确删除软连接
[root@server6 ~]# rm -rf ./test_chk_ln
[root@server6 ~]# ll
总用量 84
-rw-------.  1 root root  1257 6月  16 01:17 anaconda-ks.cfg
drwxr-xr-x. 25 root root  4096 11月  1 10:28 azkabanJob
-rw-r--r--.  1 root root 67322 11月  4 10:24 azkabanJob.zip
drwxr-xr-x.  4 root root    37 7月  13 11:01 hadoop_temp
-rw-r--r--.  1 root root    54 7月   4 14:11 HelloLinux.txt
drwxr-xr-x.  2 root root    22 11月  4 10:44 test_chk
-rw-r--r--.  1 root root    67 10月  8 15:52 zookeeper.out
[root@server6 ~]# cd test_chk/
[root@server6 test_chk]# ll
总用量 4
-rw-r--r--. 1 root root 12 11月  4 10:44 test.txt

二、硬连接

        Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接。

硬连接指通过索引节点来进行连接。

在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)
在 Linux 中,多个文件名指向同一索引节点是存在的。

比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。

硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。
其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

1、硬连接的特点

若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名

硬链接可由命令 link 或 ln 创建:

link oldfile newfile 
ln oldfile newfile

由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:

文件有相同的 inode 及 data block;
只能对已存在的文件进行创建;
不能交叉文件系统进行硬链接的创建;
不能对目录进行创建,只可对文件创建;
删除一个硬链接文件并不影响其他有相同 inode 号的文件。

示例1:文件有相同的 inode 及 data block

示例2:只能对已存在的文件创建硬连接

 

示例3:不能对目录进行创建硬连接

 

硬链接不能对目录创建是受限于文件系统的设计。现 Linux 文件系统中的目录均隐藏了两个个特殊的目录:当前目录(.)与父目录(…)。查看这两个特殊目录的 inode 号可知其实这两目录就是两个硬链接(注意目录 /mnt/lost+found/ 的 inode 号)。若系统允许对目录创建硬链接,则会产生目录环。

以上是关于Linux 命令之软连接硬连接详解的主要内容,如果未能解决你的问题,请参考以下文章

linux之软连接和硬连接的区别

linux中,啥是连结档,链接,链接目录

linux ln 连接命令怎么用?

Linux命令之软链接ln

linux ln命令

详解「复制拷贝替身软连接硬连接」区别