【Linux】创建文件链接(ln | 符号链接和硬链接)

本文详细介绍了Linux中如何创建硬链接和符号链接,并探讨了它们的区别。符号链接类似于Windows的快捷方式,而硬链接则允许一个文件有多个名称。硬链接通过inode编号共享文件数据,即使源文件被删除,硬链接仍可访问数据。符号链接在源文件删除后会失效。注意,硬链接不能用于目录且不能跨分区创建。
摘要由CSDN通过智能技术生成

摘要

本文将介绍如何在 Linux 中为文件创建硬练级和符号(软)链接,并探讨两者之间的相同和不同之处。

引言

符号链接与 Windows 中的快捷方式很像。Windows 中的快捷方式是一个带箭头的图标,空间占用一般很小,仅仅提供了一个指向目标文件的通道,Linux 中的符号链接也类似。符号链接应用很灵活,可以为任意文件创建符号链接。

虽然硬链接名字里面也有链接二字,但其与符号链接还是相当不一样的。要理解硬链接,我们得先了解若干基本概念。首先我们得搞明白 Linux 的文件是如何存储中,在 Linux 中当划分磁盘分区并格式化的时候,整个分区会被划分为两部分,即 Inode 区和 Data Block 区。

Linux 中每个文件都被分成两部分存放,一部分是文件的唯一标识,Inode-number 以及属性信息放在 Inode 区的一个 inode 中,Inode-number 和 inode 是一一对应的;另一部分是文件的实际数据,放在 Data Block 区中,在 Linux 中我们需要通过文件的 inode 来找到存放文件数据的 data block。在一个硬盘分区,不可能有两个文件公用一个 inode。自然也不可能有两个文件的 inode-number 是一样的。

如果我们将硬盘分区中所有的文件比作样一本书的话,inode 区就是其目录,data block 区对应其内容。我们必须通过目录才能找到具体的内容。我们可以通过 ls -il 列出文件的 inode-number(列出的第一个字段就是)。至此,我们初步弄明白了 Linux 中的文件到底是如何存储的,接下来我们还得弄明白 Linux 中的目录到底是怎样的文件。

Linux 中目录是一张表,每个表项代表一个文件。目录中有多少文件,就有多少表项。每个表项都包括两样数据,一是文件名,再就是 inode-number。因此 Linux 中存取文件的过程就是,通过文件名找到对应的 inode-number,再找到 inode,最后找到对应的数据。

硬链接就是在目录这张表中,让一个 inode-number 对应了多个文件名,文件 inode 和数据还是一份,没有变,只不过文件多了一个名字,这个名字就称为硬链接。

用法

符号链接

Linux 中使用 ln (link 的缩写)命令加上 -s(symbolic 的缩写) 选项创建符号链接。

ln -s [链接指向的文件] [链接名]

  • ln -s test/hello.sh hello:为 test 目录下的 hello.sh 文件创建一个名为 hello 的符号链接
$ mkdir test # 创建 test 目录
$ touch test/hello.sh # 在 test 目录下创建 hell.sh 文件
$ vi test/hello.sh # 编辑 test 目录下的 hello.sh 文件,写入内容:echo "hello"
$ ln -s test/hello.sh hello # 为 test 目录下的 hello.sh 文件创建名为 hello 的符号链接
$ chmod 764 test/hello.sh # 修改 test 目录下的 hello.sh 的权限为可执行
$ ls -l # 以长格式列出当前工作目录下的文件
总用量 4
lrwxrwxrwx 1 sdxx09 sdxx09   13 67 09:31 hello -> test/hello.sh
drwxrwxr-x 2 sdxx09 sdxx09 4096 67 09:30 test
$ ./hello # 直接执行 hello 可以打印出 hello 了,而不用转到 test 目录下去执行 hello.sh 文件(这就是符号链接的好处)
hello
$ rm test/hello.sh
$ ls -l
总用量 4
lrwxrwxrwx 1 sdxx09 sdxx09   13 67 09:31 hello -> test/hello.sh # (这里会标红)
drwxrwxr-x 2 sdxx09 sdxx09 4096 67 09:42 test
$ ./hello
-bash: ./hello: 没有那个文件或目录

虽然我们可以通过符号链接文件来读、写和执行文件,但却不代表符号链接文件和源文件是同一个文件。如果符号链接文件指定的源文件被删除,那这个符号链接文件就会失效(用 ls -l 列出会发现标红),读取或执行会显示“没有哪个文件或目录”的提示,这种情况下,我们就称这个符号链接断裂了。

硬链接

Linux 中使用 ln (link 的缩写)命令创建硬链接。

ln [链接指向的文件] [链接名]

  • ln 1.txt 2.txt:为 1.txt 文件创建一个名为 2.txt 的硬链接
$ touch 1.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 1 sdxx09 sdxx09 0 67 10:08 1.txt
$ ln 1.txt 2.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 2 sdxx09 sdxx09 0 67 10:08 1.txt
18388234 -rw-rw-r-- 2 sdxx09 sdxx09 0 67 10:08 2.txt
$ ln 1.txt 3.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 3 sdxx09 sdxx09 0 67 10:08 1.txt
18388234 -rw-rw-r-- 3 sdxx09 sdxx09 0 67 10:08 2.txt
18388234 -rw-rw-r-- 3 sdxx09 sdxx09 0 67 10:08 3.txt
$ rm 2.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 2 sdxx09 sdxx09 0 67 10:08 1.txt
18388234 -rw-rw-r-- 2 sdxx09 sdxx09 0 67 10:08 3.txt
$ rm 3.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 1 sdxx09 sdxx09 0 67 10:08 1.txt

创建前后,文件属性的第三个字段发生了改变,由一变成了二,表示文件的硬链接数目增加了一。当我们再为 1.txt 创建一个硬链接 3.txt 时,此时文件的硬链接数目变成了 3。但我们清楚,1.txt、2.txt、3.txt 本质上都是同一个文件。只不过这个文件有多个名字罢了。我们通过观察其 inode-number 可以发现,都是一样的,充分说明了这三个文件名实质上都指向了同一个文件。我们可以通过任意一个硬链接文件来读写和执行源文件。

如果将源文件删除掉,创建的硬链接并不会像符号链接一样断裂。不过文件属性中的硬链接数据会减一。我们为 1.txt 文件创建了两个硬链接 2.txt 和 3.txt,那么就相当于这个文件在文件系统中有了三个文件名。这三个文件名都指向同一个文件内容,有点像狡兔三窟的感觉。删除了一个文件,只是将某个文件名从文件系统中移除了,我们仍然能通过余下的文件名来访问这个文件的数据。事实上,只要文件还存在一个文件名,这个文件就一切正常。除非,你将三个文件都删除,我们才无法通过文件名找到文件 inode,进而访问文件数据,文件这才叫真真被删除。

硬链接由于文件系统限制,不如符号链接灵活。有两条需要注意:

  1. 强烈不推荐为目录创建硬链接。容易造成目录遍历死循环。具体原因很复杂,想了解的可以点击这里查看。
  2. 不能跨硬盘分区创建硬链接。比如你不能在 sda1 分区中创建一个指向 sda2 分区中源文件的硬链接。原因很简单,在不同的分区中文件的 inode-number 不再是唯一的。

参考

中国大学 MOOC | Linux系统管理 | 主题04 | 小节 2 | 创建文件链接

  • 10
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 Linux 中创建符号链接文件可以使用 ln 命令。格式如下: ``` ln -s [原始文件] [符号链接文件] ``` 其中,-s 参数表示创建符号链接文件。如: ``` ln -s /path/to/original/file /path/to/link/file ``` 这样就可以在 /path/to/link/file 中看到/path/to/original/file的内容了。 ### 回答2: 符号链接文件,也称软链接文件,是在 Linux 文件系统中常用的一种文件类型,它指向另一个文件或目录,相当于是创建一个“快捷方式”。符号链接文件可以帮助用户实现对文件和目录的快速访问和管理。下面简单介绍一下如何在 Linux 上创建符号链接文件。 1. 创建符号链接文件 语法:ln -s [原文件] [链接文件] 例子:将目录 /home/user/data 下的文件 file1 链接到 /home/user/Test/ 目录下,命名为link1: ln -s /home/user/data/file1 /home/user/Test/link1 2. 友好提示 如果原始文件路径含有空格,必须使用双引号或者转义符号才能够正常链接符号链接文件,例如: ln -s "/home/user/data/file name with space" /home/user/Test/ 或 ln -s /home/user/data/file\ name\ with\ space /home/user/Test/ 3. 检查符号链接文件 可以使用ls -l 命令查看符号链接文件的信息,例如: $ ls -l /home/user/Test/link1 lrwxrwxrwx 1 user user 22 Sep 1 15:23 link1 -> /home/user/data/file1 其中,lrwxrwxrwx代表符号链接文件的权限,1代表连接数,user user表示文件所有者和所属组,22代表链接文件的大小,Sep 1 15:23 是链接文件的创建时间,link1则是符号链接文件的名称。 4. 使用软链接文件 可以通过符号链接文件操作对应的源文件,例如: rm /home/user/data/file1 touch /home/user/Test/link1 以上操作可以通过软链接文件link1,更新对应的源文件。同时,更新后的源文件也会反映在软链接文件上。 由此可见,符号链接文件非常便于 Linux 用户对文件和目录进行管理,同时通过软链接可以实现对文件的快速操作和更新。 ### 回答3: Linux创建符号链接文件 在Linux中,符号链接文件是一种特殊的文件类型,它是指向其他文件的快捷方式。也被称为软链接,它类似于Windows中的快捷方式,可以在文件系统中创建一个指向另一个文件的链接,从而简化文件操作。在Linux中,可以通过 ln 命令来创建符号链接文件。 创建符号链接文件的语法如下: ln -s 源文件 目标文件 源文件:为要创建链接的源文件路径。 目标文件:为要创建的链接文件路径。 下面是一个例如:我们要在 home 目录下创建一个符号链接文件,指向目录 /var/www/html: ln -s /var/www/html ~/web 其中 -s 表示创建的是符号链接文件,/var/www/html 是要链接的源文件路径,~/web 是要创建的符号链接的路径。 注意:在创建符号链接文件时,如果目标文件已经存在,则会报错。如果想要覆盖目标文件,则需要加上 -f 参数。使用 -i 参数可以检查是否要覆盖目标文件。 总结: 符号链接文件是一种特殊的文件类型,用于创建指向其他文件的快捷方式。Linux创建符号链接文件的命令为 ln -s,语法为 ln -s 源文件 目标文件。其中源文件为要创建链接的源文件路径,目标文件为要创建的链接文件路径。如果目标文件已经存在,则需要加上 -f 参数。符号链接文件对于文件操作来说非常方便,可以快速地跳转到其他目录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xavier Jiezou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值