百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Linux软链接和硬链接的区别之ln命令详解

bigegpt 2024-08-05 11:45 8 浏览

1. 先来了解一下Linux数据是如何保存和查询的

对操作系统来说,数据分为两种:1. 用户数据 (user data) 2.元数据 (metadata)。用户数据就是保存和记录文件的内容。比如一个1M的ppt文件,500K的txt文件。这都属于用户数据。这个文件总有属性吧,比如大小、修改时间、访问时间、创建时间、存储的位置(文件所在的inode)、文件创建者等等信息。这些属性信息或者理解为汇总信息,我们称它为元数据。一句话,用户数据是文件的真实内容,而元数据则是汇总信息。

在 Linux 中,元数据中的 inode 号(inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。

2. 查看文件对应的inode号

[root@zcwyou ~]# ls -i latest.tar.gz

134474678 latest.tar.gz

linux查看文件对应的inode号

可以看出latest.tar.gz这个文件, inode 号是134474678,Linux查找读写该文件时,以为个inode号码为标识,而不是文件名。文件名类似于网站域名,仅仅是方便人类记忆。

也就是说, inode134474678有一个硬链接,它就是latest.tar.gz。

3. 根据inode号查找对应的文件

那么,问题来了,系统上有没有第二个文件,它的inode号码也是13447467。

使用find查找一下:

[root@zcwyou ~]# find / -inum 134474678

查找结果如下:

/root/latest.tar.gz

/root/latest2.tar.gz

linux根据inode号查找对应的文件

硬盘上真的有第二个文件它的inode号码也是134474678,像这种情况,我们认为inode134474678有两个硬链接。当然,这是本文作者提前准备好的。

为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。

4. 确认硬链接的数量

查看一下文件latest.tar.gz

[root@zcwyou ~]# ll latest.tar.gz

输出结果如下:

-rwxr-xr-x. 2 root root 8743850 Oct 11 15:00 latest.tar.gz

请留意输出的结果中的数字2,表示该文件存在2个硬链接。

正常情况下,一个inode只有一个链接,如下例

[root@zcwyou ~]# ll abc.txt 

输出结果:

-rw-r--r--. 1 root root 9 Nov 21 11:39 abc.txt

请留意输出的结果中的数字1,表示该文件只存在1个硬链接,默认情况下,文件都是只有一个硬链接的。

5. 查看软链接

再来看一个文件

[root@zcwyou ~]# ll /dev/stdout

lrwxrwxrwx. 1 root root 15 Sep 26 15:57 /dev/stdout -> /proc/self/fd/1

linux查看软链接

我们发现,/dev/stdout实际上指向另一个文件/proc/self/fd/1,这就是软链接。类似于Windows系统上的快捷方式。

6. 软链接与硬链接的区别

6.1 软链接特点

  • 软链接,实际上是一个独立的文件,有自己的inode。类似于Windows操作系统中的快捷方式
  • 软链接可以跨文件系统 ,硬链接不可以
  • 软链接可以对一个不存在的文件名进行链接
  • 软链接可以对目录进行链接
  • 软链接有自己的文件属性及权限等;
  • 创建软链接时,链接计数 i_nlink 不会增加;
  • 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。

6.2 硬链接特点

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

ln链接符原理如下:

Linux ln链接符原理图

7. 创建文件的链接

Linux ln命令是一个非常重要而且常用命令,它用于为文件或者目录创建链接。

7.1 创建软链接

创建一个文件,用于演示软链接。

[root@zcwyou ~]# touch soft.txt

创建软链接示例:

[root@zcwyou ~]# ln -sf soft.txt soft123.txt 

检查结果:

[root@zcwyou ~]# ll soft123.txt 

输出文件属性

lrwxrwxrwx. 1 root root 8 Nov 26 17:48 soft123.txt -> soft.txt

linux创建软链接

可以看出这个文件指向当前目录soft.txt,配置成功。7.2 创建硬链接

创建一个文件,用于演示硬链接。

[root@zcwyou ~]# touch hard.txt

创建硬链接,没有使用选项

[root@zcwyou ~]# ln hard.txt hard123.txt 

检查结果:

[root@zcwyou ~]# ll hard123.txt 

输出文件属性:

-rw-r--r--. 2 root root 0 Nov 26 17:47 hard123.txt

linux创建硬链接

留意以上输出数字2,表明该文件有2个副本。

8. 总结

ln命令可以创建文件的副本,也可以创建软链接。

点击了解更多,原文排版更直观易读哦

相关推荐

Go语言泛型-泛型约束与实践(go1.7泛型)

来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...

golang总结(golang实战教程)

基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...

Go 官宣:新版 Protobuf API(go pro版本)

原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...

Golang开发的一些注意事项(一)(golang入门项目)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

golang 托盘菜单应用及打开系统默认浏览器

之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...

golang标准库每日一库之 io/ioutil

一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...

文件类型更改器——GoLang 中的 CLI 工具

我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...

Go (Golang) 中的 Channels 简介(golang channel长度和容量)

这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...

Golang引入泛型:Go将Interface「」替换为“Any”

现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...

一文带你看懂Golang最新特性(golang2.0特性)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移

以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...

Golang使用grpc详解(golang gcc)

gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转golang)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...