Linux ln 命令

Intro

Linux 中的文件分为 Hard Link 和 Symbolic Link 两种。Hard Link 文件又被称为硬链接文件、实体链接文件,Symbolic Link 文件则常被称为符号链接、软链接文件。

ln 命令用来在文件之间建立链接。在介绍 ln 命令前,让我们先来搞清楚究竟什么是硬链接,什么又是软链接。

Hard Link(硬链接)

我们知道,在 Linux 系统中,每个文件对应一个 inode,文件的内容在存储在 inode 指向的 data block 中。要读取该文件的内容,需要通过文件所在的目录中记录的文件名找到文件的 inode 号,然后通过 inode 找到存储文件内容的 data block(参考《Linux 文件与目录》)。

也就是说,文件名存储在目录中,inode 号执行文件存储的内容,文件名和 inode 之间有一个对应关系。那么多个文件名可不可以同时指向同一个 inode 呢?答案是可以的,这就是硬链接!从本质上来说,硬链接只是在目录下新添加了一个文件名,这个文件名与一个已有文件的 inode 相关联。让我们也通过 /etc/crontab 文件来进行观察:

$ ll -i /etc/crontab **131213** -rw-r--r-- 1 root root 722 Nov 16 2017 /etc/crontab

使用 ln 命令在当前目录下创建一个 /etc/crontab 文件的硬链接,然后观察其文件属性:

$ sudo ln /etc/crontab .

$ ll -i /etc/crontab crontab **131213** -rw-r--r-- 2 root root 722 Nov 16 2017 crontab **131213** -rw-r--r-- 2 root root 722 Nov 16 2017 /etc/crontab

这两个文件名关联的 inode 号完全相同,都是 131213,所以它们指向的是同一个文件。同时请注意文件属性中的第三个字段,由 1 变成了 2。这个字段被称为 "链接数",它说明有多少个文件名链接到同一个文件的 inode。

另外需要注意的一点是上面所有输出中的第二个字段中的第一位,它们都是 "-",它说明这个文件的类型为普通文件,链接类型为硬链接。

我们可以通过下图来理解硬链接在文件系统中的实现方式:

硬链接的特点

几乎不额外占用空间

只要还有一个文件名引用着文件,文件就不会被真正删除

由于硬链接只是在目录中添加了一条包含文件名和 对应 inode 的记录,所以它几乎不会消耗额外的磁盘容量。

另外在删除硬链接所关联的文件时,其实只是删除了一条目录中的记录,真正的文件并不受影响。只有在删除最后一个硬链接时才会真正删除文件的内容数据。

硬链接的局限性

不能跨文件系统创建硬链接

不能链接目录

由于这两个限制,实际使用中硬链接并没有软链接使用的广泛,下面我们看看究竟什么是软链接。

Symbolic Link(软链接)

软链接的实现方式与硬链接有本质上的不同。创建软链接时会创建一个新的文件(分配一个 inode 和对应的 data block),新文件的 data block 中存储了目标文件的路径。

还拿 /etc/crontab 文件举例子,这次创建一个软链接并查看其文件属性:

$ sudo ln -s /etc/crontab crontab2

第一列,两个文件名对应的 inode 不同,说明这是两个文件。

第二列显示的文件权限也不一样,这一点和硬链接完全不同。注意文件类型被标记为 "l",说明这是一个软链接文件。

第三列很有意思,注意 /etc/crontab 文件的链接数量,还是 2,这和创建软链接文件 crontab2 前是一样的。也就是说创建软链接并不增加原文件的链接数。

第六列是文件大大小,注意新建的软链接文件大小为 12 Bytes,也就是字符串 "/etc/crontab" 的长度。

最后一列会友好的显示出软链接文件指向的源文件。

我们可以通过下图来理解软链接在文件系统中的实现方式:

从上图我们可以看出,软链接文件 crontab2 是一个实实在在的文件,有自己的 inode 和 data block。但是它的 data block 中保存的是目标文件的地址:/etc/crontab。 像 open() 这样的 API 能够识别出软链接,并根据 data block 中的目标文件径把操作重定向到目标文件上。

可以链接目录是软链接的一大优势,创建目录链接的方式和普通文件一样:

$ ln -s /bin testbin

此时进入 testbin 目录和进入 /bin 目录是一样的。

更厉害的是,还可以跨文件系统创建软链接!

删除源文件

对于软链接来说,删除源链接后,链接文件就会无法找到指向的源文件了。看下面的演示:

$ echo "hello world" > hello.txt

$ ln -s hello.txt hello2

$ cat hello2

hello world

$ rm hello.txt

$ cat hello2

cat: hello2: No such file or directory

删除原文件后,操作链接文件时的提示是:"No such file or directory"。

文件的链接数

从上文中的示例我们可以看到,当创建硬链接文件时,文件的链接数会增加 1,而创建软链接时文件的链接数却不发生变化。

下面让我们看一个目录文件的链接数,先创建一个空目录:

$ mkdir /home/nick/testdir

$ ll /home/nick | grep testdir

drwxr-xr-x **2** nick nick 4096 Jul 10 08:58 testdir/

新建的空目录有两个硬链接,分别是:

/home/nick/testdir /home/nick/testdir/.

而 /home/nick/testdir 目录下还有一个指向其父目录的硬链接:/home/nick/testdir/..

也就是说当我们创建一个目录时,其父目录的硬链接数会增加 1。

ln 命令

ln 命令用来在文件之间建立链接,其的常用方式为:

ln source target

ln -s source target

它们分别用来创建硬链接文件和软链接文件。还有一个比较常用的选项是 f,它会强制删除已经存在的目标文件。

参考:

Memo

Linux ln -s目录,Linux 中的 ln 命令相关推荐

  1. linux 修改proc目录,Linux_Linux中系统参数修改命令sysctl的使用讲解,sysctl配置与显示在/proc/sys目录 - phpStudy...

    Linux中系统参数修改命令sysctl的使用讲解 sysctl配置与显示在/proc/sys目录中的内核参数.可以用sysctl来设置或重新设置联网功能,如IP转发.IP碎片去除以及源路由检查等.用 ...

  2. linux 网卡配置目录,Linux目录结构以及网卡配置

    一.Linux下的目录结构 /bin 存放二进制命令 /boot系统引导程序 /dev设备,硬盘 /etc系统应用的配置文件 /home普通用户家目录 /lib库文件 /lib64 64位的库文件 / ...

  3. linux mkfs 源码,Linux系统下移植busybox中mkfs.vfat命令

    为了延长磁盘寿命来存储音视频文件,打发在格式化磁盘过程中将簇的大小设置大点.因为存储的音视频文件现对较大,那么将簇大小设置得尽可能大,这样可以增强磁盘读取数据的性能,同时也不会浪费太多空间. 但发现我 ...

  4. Linux ln -s目录,Linux ln 命令的使用

    1.命令简介 ln 命令用来为文件创建链接,分为硬链接(hard link)和软链接(符号链接,symbolic link)两种,默认创建硬连接,如果要创建软链接须使用 -s 选项.本文介绍的是 GN ...

  5. linux++tar打包目录,linux中tar命令打包目录与排除目录打包linux操作系统 -电脑资料...

    本文章来给各位朋友详细介绍关于linux中tar命令打包目录与排除目录打包有需要了解tar命令的使用方法的朋友可进行参考参考, 打包压缩目录很简单如下代码如下复制代码 tar -czf small.t ...

  6. linux lftp下载目录,linux中使用lftp上传下载文件

    lftp是linux中一款ftp服务器相比windows中的ftp显得要复杂不少了,下面我来总结一下lftp文件上传,文件下载,及文件查找等等相关命令吧. lftp连接的几种方法,最常用的是lftp ...

  7. linux创建更改目录,Linux中目录的创建与删除命令使用说明

    mkdir命令 mkdir 用于创建一个或多个目录 语法: 语法是 mkdir [命令开关] 目录 命令开关: -m 文目录设置操作权限 -p 如果上级目录不存在,同时创建它们. -v 输出创建的每个 ...

  8. linux 文件系统覆盖目录,Linux内核裁减及根文件系统定制

    一.内核编译 1.准备工作 (1)整理出系统需要支持的硬件.文件系统类型以及网络协议等内容. (2)建议用命令uname –r 查看一下系统的版本号,如果你的系统版本与将要编译的内核版本一致,建议将/ ...

  9. linux gcc 安装目录,Linux下安装GCC

    为了在Ubuntu下安装那令人悲催的GCC,小弟可是绞尽脑汁,连干三天...当我搞清楚那些破软件m4,gmp mpfr,mpc等之间的依赖关系,依照强大的度娘提示下,安装了一遍又一边一边又一边···· ...

最新文章

  1. 【独家】IT自由职业者是怎么样的感受和体验
  2. 如何matlab导入邻接矩阵,“excel如何做矩阵“matlab中读取excle中的邻接矩阵
  3. SpringBoot 参数符号转义,用这个包下面的类
  4. 软件能力成熟度CMMI3管理过程域
  5. Linux系统中增加Swap分区大小
  6. 课工场新闻管理jsp修改项目_jspmvc实验室预约管理系统
  7. 大数据之-入门_大数据部门组织结构(重点)---大数据之hadoop工作笔记0007
  8. 叶面积指数(LAI)数据、NPP数据、GPP数据、植被覆盖度数据获取
  9. TTL门电路与CMOS门电路
  10. 一文搞懂无刷电机和有刷电机
  11. 支付机构备付金管理过程
  12. 基于JAVA竞赛信息发布及组队系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  13. 电视连接WiFi中心服务器异常,网络电视登录失败怎么办?为什么电视连接wifi常常显示登陆失败?...
  14. 中国一些著名网站的主题颜色
  15. 工程电磁场导论第二章总结
  16. fmc接口定义_FMC(FPGA Mezzanine Card)_百度百科
  17. C++带赖子的麻将听牌检测算法实现
  18. Bibox恒星陨落,IEO正在走向下半场?
  19. 逻辑网络设计——三层网络结构(核心汇聚接入)学习心得
  20. cad展点kszd小程序_CAD展点程序lisp

热门文章

  1. 网页flv视频播放代码
  2. 数字经济绿色创新匹配:全国3169公司数字金融企业绿色专利匹配数据 2011-2019年
  3. 华为云从入门到实战 | 云容器服务
  4. 9. docker——DockerFile案例
  5. php获取哔哩哔哩追番_自己拥有一台服务器可以做哪些很酷的事情?
  6. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(RS485)
  7. [Erlang] XML处理方案
  8. php 手机swf播放器,PHP实现使用优酷土豆视频地址获取swf播放器分享地址_PHP教程...
  9. Mac 解压缩rar文件
  10. Stimulsoft Reports.JAVA 2022.4.3 Crack