一、软链接与硬链接的区别
硬链接就是同一个文件使用了多个别名(他们有共同的 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的时间)
可以用stat命令查看文件的inode信息:
从上图我们可以看到用stat查看文件的元数据的内容都有哪些(除了文件名),而事实上文件除文件名以外的所有信息都存储在inode中,而文件名另有存储区。
3、inode的大小
inode中存储着文件的元数据,所以inode也是要占用存储空间的;所以在硬盘格式化时,操作系统会自动将硬盘分成两个区域。一个是数据去,存放文件数据,一个是inode区,存储文件的元数据。inode节点大小在格式化时,就会设定。一般是128字节或256字节。例如一块1GB硬盘,每个inode节点大小为128字节,每1KB设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%
查看每个分区的inode总数和使用率,可以使用df -i命令
由于每个文件都要有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输出结果在终端上之间显示是横向排序!但是实际输出结果在重定向到文本文件中时,是以列的形式排序,所以要注意
命令解析: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 将除字母意外的重复的空白字符压缩删除;