linux操作系统-软硬链接、数据流、重定向

一、软硬链接

首先我们应知道文件在硬盘中是如何存储的,硬盘不能直接存储文件,所以我们需要给他一个文件系统。文件系统实际上就是告诉硬盘如何存文件。如果没有文件系统那么文件会随意存入磁盘,导致想要查找一个文件非常困难。文件系统会将磁盘分成多个区域,分别为inode节点区和文件真实存储区。下面我们通过一张图片来了解软硬连接。

假设我们创建了一个文件1.txt,它的元数据会存储在inode节点区,inode节点区会赋予该文件一个inode节点编号,真实数据存储在真实数据存储区。

我们可以通过文件名1.txt找到它的inode节点编号再通过inode节点编号找到他的真实数据,这是正常的文件访问路径。我们在使用windows时发现有的时候删掉了文件在桌面的快捷方式后仍然可以在回收站中找到该文件的真实数据,其实你只是删掉了该文件的一种访问方式,什么时候该文件的全部访问方式都被删除,那么该文件的真实数据也将永久被删除。在linux操作系统中也是一个道理。

我们给文件1.txt创建了一个硬链接文件2.txt,硬链接文件有一个特点,它与源文件共享同一个inode节点编号,所以硬链接也可以通过inode节点编号访问到文件1.txt的真实数据,删除源文件1.txt后也不会影响硬链接文件正常访问源文件的真实数据。

我们再给1.txt创建一个软连接文件3.txt,软链接文件也有自己的特点,它有自己单独的inode节点编号,它并不会和源文件共享一个inode节点编号。软连接文件中存储的是源文件的绝对路径,也就是说打开软连接文件后它会先找源文件1.txt然后再通过1.txt找到它的inode节点,最终访问到源文件的真实数据。如果源文件被删除了,那么软连接文件也就找不到源文件的绝对路径了,也就意味着无法访问源文件的真实数据了。

这就是软硬链接的区别,下面我们来总结一下软硬连接的特点:

1、硬链接的特点:

源文件删除,硬链接文件正常访问

和源文件共用一个inode节点

目录文件无法创建硬链接,硬链接不可以跨分区(也就是相当于windows中跨磁盘)

硬链接文件的创建方式为:ln 源文件 目标文件

2、软链接(就是windows里面的快捷方式)

源文件删除之后,目标文件无法访问

软链接可以跨分区 inode节点与源文件不同,且软连接文件的真实内容存储的是源文件的真实绝对路径

软连接文件的创建方式为:ln -s 源文件 目标文件

下面我将通过实际操作来展示软硬连接的特点。

首先我在/opt下创建了文件1.txt,并往1.txt中写了“1,2,3,4” 4个数字。

cd:切换文件

touch:创建文件

ls:列出给定文件(默认为当前目录)的信息

echo:将参数写到标准输出,这里配合>>运用到了重定向的知识,下面会讲

cat:查看文件内容

我们先为文件1.txt创建硬链接,通过实际操作我们验证了之前所说的特点。

rm:删除文件

补充一点:当我们创建了硬链接以后,通过stat命令查看源文件信息发现硬链接次数为2,硬链接次数也就是有几条路径可以访问到源文件的真实数据,如果所有路径都被删除即硬链接次数为0时,源文件中的真实数据将彻底被删除。

stat:显示文件或文件系统的状态

通过查看我们发现硬链接的inode节点和源文件一样

接下来是软连接

软连接和源数据inode节点不一样

二、数据流和重定向

我们先来认识三个概念

标准输入 (一般用0表示):默认情况下,标准输入,指的就是从键盘输入进去的命令

标准输出 (一般用1表示):默认情况下输入的 命令的标准输出是通过屏幕输出    

标准错误输出 (一般用2表示):命令执行失败之后所显示的报错信息默认 从屏幕上输出

通过这三个概念我们可以得出数据流和重定向的概念数据流即数据流动的方向,我们从键盘输入数据,数据执行完毕后再从屏幕输出。

我们在键盘是输入一个数据正常是从屏幕上输出,但是我想把输出的内容放到一个文件里也就是改变了数据输出的方向,这就是重定向。那为什么需要把数据重定向呢?有时我们处理的命令结果有很多,有标准输出也有标准错误输出它们混在了一起很难分辨,为了使输出的数据更加简洁我们可以把标准输出放到一个文件中,把标准错误输出放到另一个文件中。

如何实现数据的重定向呢?

我们用到了 输出重定向   >   >>

>   对标准输出重定向,但是是覆盖的形式,下次输出的内容会覆盖上一次输出的内容。

>>   对标准输出重定向,但是是追加的形式,下次输出的内容会跟在上一次输出的内容的后面。

假设我们将ls /输出的数据放到文件right.txt中,此时ls /输出的内容并不会出现在屏幕上,而是被我们转移到文件right.txt中去了,如果转移的文件不存在,系统会自动给你创建一个。

提前声明一下:我只是拿ls命令举例,实际上任何命令输出的数据都可以重定向

当我们用ls查看一个不存在的文件,也就是说会产生标准错误输出,一般情况下标准错误输出是不会通过重定向转移到目标文件中去,而是直接从屏幕输出。

我们可以通过以下操作把标准错误输出放到目标文件中

根据这个方法我们可以进行更复杂的操作,例如:ls / /etc /dsdf /kjhg /eeeem将这个命令中的标准输出放到文件right.txt中,将标准错误输出放到文件error.txt中。

那如何将标准输出和标准错误输出一起放进一个文件all.txt中呢?我们可以进行以下操作

&在输出重定向中表示的是所有的,全部的,都

下面介绍一个特殊的文件/dev/null

/dev/null   :会把所有的放进去的文件销毁掉,我们可以先查看一下它的文件类型

通过查看发现/dev/null是一个设备文件,当我们不想要某个输出的数据时我们可以把他重定向到/dev/null中

< (文件)输入重定向,原本我们是通过键盘输入的,现在可以从某个文件中输入,这个不常用,了解即可。

<<比较重要,说它之前我们知道,cat (文件)是查看文件内容,但cat后面没有跟操作对象,那么就是把用户的标准输入标准输出到屏幕上,也就是我们输入什么,屏幕就会立刻输出什么。

既然这样我们可以把cat输出的数据重定向到一个文件中,此时输出的数据就不会直接显示在屏幕上了而是重定向到目标文件中去了

那怎么退出呢?除了ctl+d,我们还可以指定一个结束符,当用户输入该结束符,自动退出。这时我们就用到了前面说的<<符

<< 指定结束符

接下来介绍echo命令

echo 把标准输入的数据标准输出到屏幕上,这个命令也可以进行重定向

下面介绍tee命令

用法:tee [选项]... [文件]...
将标准输入复制到每个指定文件,并显示到标准输出。它可以将标准输入标准输出到屏幕上的同时将标准输出重定向到文件中

最后我们介绍一个符号

| (管道符)把左边命令的输出结果,作为右边命令的输入,这个符号很重要,以后很多命令都会用到它,以后会详细讲。

今天就举一个例子,就比如下面的命令,正常是查看/etc/passwd的内容并输入,我们加入了管道符,将左边命令输出的内容作为右边的输入把/etc/passwd的内容通过tee重定向到文件2.txt中去

more命令:分页显示文件里面的内容

less命令: 分页查看 q键退出

head命令:默认情况下查看文件的前10行 -n 指定查看文件的前num行

tail命令:默认情况下查看文件的后10行 -n 指定查看文件的后num行

                                                                                                                                                           

                                                                                                                                                     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值