一、软链接与硬链接的区别   

硬链接就是同一个文件使用了多个别名(他们有共同的 inode)。

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

#link oldfile newfile 
#ln oldfile newfile

  由于硬链接是有着相同 inode 号仅文件名不同的文件,因此,删除一个硬链接文件并不影响其他有相同 inode 号的文件。有防止误删除的功能

  硬连接大小和源文件一样

  硬链接不能对目录进行创建,只可对文件创建。


  软链接(也叫符号链接)与硬链接不同,文件用户数据块中存放的内容是另一文件的路径名的指向。软链接就是一个普通文件,只是数据块内容有点特殊。不能防止误删除

  软链接大小和源文件不一致

  软链接可对文件或目录创建。

ln -s old.file soft.link
ln -s old.dir soft.link.dir

加-s选项表示创建的是软链接。

删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接就变成了死链接。


二、inode 工作原理

  1、什么是inode

  首先文件的数据分为两部分:元数据和数据(内容)

  文件存储在硬盘上,而硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区存储512字节(相当于0.5KB)

  而操作系统读取硬盘的时候,不会一个个扇区的读取,而是一次连续读取多个扇区,即一次性读取一个“块”(block)。这种有多个扇区组成的“块”,是文件存取的最小单位,“块”的大小,最常见的是4KB,即连续八个sector组成的一个block

  文件的数据存储在“块”中,那文件的元数据也要存储在一个地方,而这个地方就叫做inode,中文为:“索引节点”。

  也就是说inode=存储文件元数据的区域=索引节点

 2、inode的组成

   inode存储文件元数据的,包括文件的权限、所属主、组、时间戳、大小等;具体情况如下

   文件的读(r)、写(w)、执行(x)权限;例如-rwxrw-rw-

   链接数,既有多少文件名指向这个inode(也就是硬链接数)

   文件数据block的位置

   文件的大小字节数byte

   文件的拥有者属主User ID=UID

   文件的属组Group ID=GID

   文件的时间戳:共有三个,atime=访问时间;mtime=修改(内容)时间;ctime=更改(由元数据)时间(因为inode存储元数据,所以也可以说是修改inode的时间)

wKioL1eelliBLsYdAAEOiVl4l5Y512.jpg

可以用stat命令查看文件的inode信息:

wKiom1eelnOz52kcAACJsVQyNh4780.jpg从上图我们可以看到用stat查看文件的元数据的内容都有哪些(除了文件名),而事实上文件除文件名以外的所有信息都存储在inode中,而文件名另有存储区。

 3、inode的大小

   inode中存储着文件的元数据,所以inode也是要占用存储空间的;所以在硬盘格式化时,操作系统会自动将硬盘分成两个区域。一个是数据去,存放文件数据,一个是inode区,存储文件的元数据。inode节点大小在格式化时,就会设定。一般是128字节或256字节。例如一块1GB硬盘,每个inode节点大小为128字节,每1KB设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%


查看每个分区的inode总数和使用率,可以使用df -i命令

wKiom1eemlKzU0qgAAB5jzAq-KY321.jpg

  由于每个文件都要有inode,而每个分区提供的inode也是有限的,所以存在硬盘空间未满,inode已满,而不能够创建新文件的情况

  4、inode号码

    在每个分区中每一个inode都有唯一一个号码,不同分区,inode号码有可能相同,所以每个分区都有自己的inode table,操作系统通过分区内唯一的inode号码来识别查找不同的文件。

    而在linxu系统内部,系统本身是不使用文件名来识别文件的,文件名在系统内只是inode号码便于用户使用的别称。在实际操作过程中,用户像是通过文件名找到并对文件进行操作,但事实上在系统中,系统显示用文件名找到对应的inode号码-->获取inode的信息(元数据和指针)-->找到文件数据所在的数据块block,最后读出数据的。

可是使用ls -i命令查看文件的inode号码

ls -i 文件

  5、目录文件

      在linux系统中,目录也是文件;而与inode table对应的这是目录项(dirent)。每个目录项,由两部分组成:包含文件的文件名,以及该文件名对应的inode号码

 可以用ls -i命令查看目录的inode号码

ls -i 目录

  6、inode的特殊作用

    1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除 inode 节点,就能起

到删除文件的作用。

    2. 移动文件或重命名文件,只是改变文件名,不影响 inode 号码。

    3. 打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。因此,

通常来说,系统无法从 inode 号码得知文件名。

    4.删除文件,实质上是删除对应文件的inode,而数据并没有删除,如果恢复数据,则恢复对应的inode号码即可;而如果有新文件占用原inode号码,则数据会被覆盖


三、课前预习

  1 、将/etc/issue 文件中的内容转换为大写后保存至/tmp/issue.out 文件中

cat /etc/issue |tr [[:lower:]] [[:upper:]] > /tmp/issue.out

2 、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out 文件中

who |tr [[:lower:]] [[:upper:]] > /tmp/who.out

3 、一个linux 用户给root 发邮件,要求邮件标题为”help” ,邮件正文如下:

Hello, I am  用户名,the system version is here,please help me to

check it ,thanks!

操作系统版本信息

mail -s Help root <<end
> Hello,I am `whoami`,
> the system version is here,
> please help me to check it,
> thank!
> `lsb_release`
> end

       或者可以将命令 whoami 换成$(echo $USER)也可以

4 、将/root/ 下文件列表,显示成一行,并文件名之间用 空格 隔开

ls /root/ |tr "\n" " "

注意:ls输出结果在终端上之间显示是横向排序!但是实际输出结果在重定向到文本文件中时,是以列的形式排序,所以要注意

wKioL1efSbzzu2y7AAB-92jimW4979.jpg

     命令解析:ls /root/产生的文件列表结果通过管道传给tr命令

            tr "\n" " " > Output.txt   是将列表信息中的换行符 \n 替换成空白字符(空格)然后把输出结果重定向到Output.txt文本文件中

5 、file1 文件 的 内容为:”1 2 3 4 5 6 7 8 9 10”  计算出所有数字的总和

echo "1 2 3 4 5 6 7 8 9 10" > file1
cat file1 |tr " " "+" |bc

6 、删除Windows 文本文件中的'^M' 字符

  现在windows创建文本文件test.txt,输入a、b、c、d每个字母都回车换行

cat -A test.txt        #这一步是查看text.txt文件内的^M符号的,不看也行
cat -A test.txt |tr -d "\r" >Output.txt
cat Output.txt                   #检查结果

命令解析:window中的换行符号是^M,而linux的是\n所以很容易识别

       利用cat -A test.txt将包括^M在内的所有内容通过管道 | 传给tr

       tr -d "^M" >Output.txt  将传过来结果中的"^M"删除,然后输出重定向到Output.txt文本文件中

7 、处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4 ”,只保留其中的数字和空格

echo 'xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4 ' |tr -cd [[:digit:]" "]

命令解析:echo 'xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4 '将结果传递给tr

      值得注意的是在此字符串中存在!$,而如果不用''强引用,则会相当于上一命令最后一项

      tr -cd [[:digit:]" "]  中 -c 为补集  -d 是删除  所以意思是将数字和空白字符的补集,即除了数字和空白字符意外的删除

8 、将PATH 变量每个目录显示在独立的一行

echo $PATH |tr ":" "\n"

命令解析:echo $PATH 得到的变量结果通过管道 | 传给tr,而$PATH变量中分割符为“:”

      tr ":" "\n"   将分割符“:”替换成“\n”换行符

9 、删除指定文件的空行 

cat Output.txt |tr -s "\n"

命令解析:cat Output.txt 将结果传给tr

       tr -s "\n" 将重复的"\n" 换行符删掉压缩

10、将文件中每个单词(字母)显示在独立的一行,并无空行

cat Output.txt |tr -cs [:alpha:] "\n"

命令解析:cat Output.txt将结果传递给tr

      tr -cs [:alpha:] "\n"   -c 将大小写字母[:alpha:]的补集,即除字母意外的,全部替换为换行符"\n",然后利用 -s 将除字母意外的重复的空白字符压缩删除;