文件管理 2

文件管理 2

目录

1.inode
2.目标和inode
3.文件操作命令与inode
4.链接:ln
5.文件数据查看

上一篇简单介绍对文件系统认识和相关操作,只是在文件目录表面打转,没能深入内部。接下来就是看看文件内容相关信息。
linux中都是文件,那么文件包含那些数据呢呢?
文件存储的数据包含两类:一类是元数据,另一类是数据。
元数据简单的来说就是文件的基本属性信息,文件类型,权限,Gid,Uid,链接数,大小等数据。而数据就是你进入文件内部所看到的数据,也就是你创建这个文件为了存储的东西。
说到元数据不得不说inode表。

1.inode

我们先来看看inode表结构图

从图中可以看到第一列的信息,那就是inode所含有的信息。也就是说inode中有:mode说的是文件是什么类型的;owener info说的是文件自身的信息,这里就包含了inode号,谁能使用这个文件,链接数等信息;size也就是文件的大小;timestamps说的是时间戳,也就是atime、mtime、ctime;剩下的就是各种指针了,用来指向数据存储的地方,来让我找到这个文件存储的数据;还有些有关文件的其他的信息。
我们可以通过下图来简单来看下inode信息:

你可能发现上面说的信息没有文件名,是的,文件名没有存在inode中,具体什么原因下面还会再说。
从上面我们了解了inode表的,那么它是怎么用的呢。这里得说下一种特殊的文件:目录。

2.目录与inode

目录是一种特殊的文件。目录的元数据也是inode信息,但目录的数据就就是所包含文件名与文件名对应的inode号。人是通过文件名来引用一个文件的,但系统是通过inode号获取inode信息最终找到数据来读取从而引用文件的。
我们来把这个过程通过图来显示下:

人在目录下找到文件然后打开。而在系统中,是找到文件对应的inode号,然后从inode号找到inode表上对应的inode信息。
从上面图中可以看出来:目录中的文件a,对应的inode表中的inode1,通过inode1上的指针信息在数据区找到对应的数据块。
inode表中包含文件系统的所有文件列表,并且约占系统磁盘空间的1%。
说到这里,我们就可以从另个角度来解释下,文件操作命令的实质是在操作什么东西了。

3.文件操作命令与inode

这里简单说几个命令,大家理解下:

1.cp与inode

cp命令是让系统分配一个空闲的inode号,并在inode表中生成个新条目来放这个inode号;而在目录中是创建一个新的文件项目,然后新的inode号与新文件项目关联起来;这样文件元数据中也就存有这个inode号了,然后系统拷贝数据到新文件中。这样新文件就生成了。

2.rm与inode

rm是把inode号从文件的元数据中释放出来,也就是让inode号之间的链接断开;这个被释放出来的inode号,可以被其他文件使用;系统会删除文件项目;存放上个文件数据的数据块会放置在空闲的列表中等待被重新使用。
所以说,实际上数据没有马上被删除掉,而是当另一个文件使用这个数据块是将原来的数据进行了覆盖,这才把上次的数据删除。这也是安全删除命令shred的工作原理。

注意:说到这里,有个关于inode号实际问题

  • 某设备显示空间不足,但实际查看磁盘空间时,发现还有大量的空闲空间,这是出现什么问题了呢?通过df -i发现inode号用完了。这里你要做的是把inode号释放出来就行。
3.mv和inode

mv的目标和源在相同的文件系统时,mv是在新目录条目中创建新的和原来一样文件名,在旧的目录条目中删除旧的文件名;其中inode号不会释放,把inode号从旧的文件名上断链且链接到新的文件名上。也就是说不会影响除了时间戳外的其他元数据,磁盘上的数据位置也没有移动。
mv的目录和源不在相同的文件系统时,那么mv就当于cp和rm的组合使用了。
上面说到inode号,那么要是两个文件的inode号相同呢,是不是就代表两个文件是同一个文件?答案是肯定的,这里我们称两个有相同inode号的文件之间存在链接 。

4.链接:ln

实际上链接分为两种:硬链接和软链接。
ln - make links between files

-f, --force:remove existing destination files
-P, --physical:make hard links directly to symbolic links
-s, --symbolic:make symbolic links instead of hard links
-v, --verbose:print name of each linked file

大家可以通过man ln来查看ln详细信息,可以看到命令的语法有4种,选项也有好多,这里我就简单把我理解的说下,其他大家一起多练习。

1.硬链接

ln filename linkname

硬链接的特点:

  • 创建硬链接会增加额外的记录项以引用文件
  • 对应于同一个文件系统上一个物理文件,虽然是两个文件,但本质上就是同一个文件
  • 每个文件引用相同的inode号
  • 创建时链接数增加
  • 删除文件时,会递减计数的链接,文件要存在则至少有一个链接数,当链接数为0时,文件就被删除了。
  • 不能对目录进行硬链接
  • 不能跨越分区或驱动器创建硬链接
2.软连接

ln -s filename linkname

软链接的特点:

  • 利用一个符号链接指向另一个文件
  • 一个符号链接的内容是它引用文件的名称
  • 查看其内容时,是查看被链接的文件
  • 可以对目录进行软链接
  • 可以跨分区
  • 指向的是另一个文件的路径,其大小为指向的路径字符串的长度
  • 不增加或减少目标文件的inode的引用计数
  • 文件引用的是不同的inode号
  • 本质上为不同的文件
  • 链接数会增加或减少
3.创建软硬链接

ln filename linkname
ln -s filename linkname

filename是被链接的文件,linkname是链接文件。

ln a b
ln -s a b

就是创建个b,来链接a;时刻注意这个顺序。
这里filename和linkname有个路径问题:

  • 创建硬链接时,用相对路径还是绝对路径都可以,毕竟是创建了个文件名不同但内容相同的文件。这是链接数是会增加的。

  • 创建软链接时,虽然用绝对路径不容易出错,但系统用的都是相对路径,我们也用相对路径好些。


注意

  • 1.软链接的相对路径是相对软链接名所在目录的路径。
  • 2.建立链接时,确保链接名是原本就不存在的,不然会出现:1)链接目录时,目录原本要是存在的,会在这个目录下创建链接,这时你要使用的是相对路径,可能会生成错误的链接,除非你提前计算过了。2)链接文件时,如果文件已经存在会有提示,要是继续用这个就加-f,不过这样会把原文件内容删除。

5.文件数据查看

上面说的都是与文件元数据有关的接下来说下文件的数据
文件可以包含多种类型的数据,不同类型的数据文件要用适当的打开命令才能正常打开。这就用到文件类型辨别命令。

1.确定文件类型:file

file — determine file type
file [OPTION...] [FILE...]
-b, --brief:列出文件辨识结果时,不显示文件名称
-f, --files-from FILE:列出文件列表中文件的类型
-F, --separator STRING:使用指定分隔符来取代“:”
-L, --dereference:查看对应文件的文件类型

这里就列出几个常用的其他的可以根据需求自己查找。这里写几个例子:

从结果上我们可以根据不同的结果,找相应的查看命令,进行文件查看。

2.文件查看:cat,tac,rev

cat - concatenate files and print on the standard output

cat [OPTION]... [FILE]...
-E, --show-ends:显示行结束符$
-n, --number :对显示的每一行进行编号
-b, --number-nonblank:对非空行进行编号
-s, --squeeze-blank :压缩连续的空行成一行
-A, --show-all :显示所有控制符

tac - concatenate and print files in reverse

tac [OPTION]... [FILE]...
-b, --before: attach the separator before instead of after
-r, --regex:interpret the separator as a regular expression
-s, --separator=STRING:use STRING as the separator instead of newline

rev - reverse lines of a file or files

rev [options] [file ...]

当文件的数据过于大的时,用上面的命令就显得不方便,这时就需要用到下面的命令了。

3.分页查看文件数据:more,less

more - file perusal filter for crt viewing

more [options] file [...]
-d :显示翻页和退出信息

less - opposite of more

一页一页的查看文件或stdin输出
/: 搜索文本
n/N: 跳到下一个或 上 一个匹配
更多详细的信息可以同man查看

4.文件内容提取命令:head,tail,cut,sort,uniq

head - output the first part of files

head [OPTION]... [FILE]...
-c #: 指定获取前# 字节
-n #: 指定获取前#行 行
-#:指定行数

tail - output the last part of files

tail [OPTION]... [FILE]...
-c #: 指定获取后# 字节
-n #: 指定获取后#行
-#:指定行数
-f:跟踪显示文件新追加的内容, 常用日志监控

cut - remove sections from each line of files

cut OPTION... [FILE]...
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:选取相应的字段,可以是单个选择#,也可以使连续的#-#,也可以是多个单一的#,#,也可以混合在一起使用#-#,#。
-c:按字符切割
--output-delimiter=STRING: 指定输出分隔符

sort - sort lines of text files

sort [OPTION]... [FILE]...
-r : 执行反方向(由上至下)整理
-n : 执行按数字大小整理
-f: 选项忽略(fold )字符串中的字符大小写
-u : 选项(独特,unique )删除输出中的重复行
-t c: 选项使用c 做为字段界定符
-k X : 选项按照使用c 字符分隔的X 列来整理能够使用多次

uniq - report or omit repeated lines

uniq [OPTION]... [INPUT [OUTPUT]]
-c: 显示每行重复出现的次数,连续且完全相同方为重复
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行

上面几个命令的选项都是经常能用到了,其他大家可以根据情况自己查找。如下所示,一般就是查找些想要的数据:

有关文件内部的元数据和数据这里只是简单根据自己的理解说了下,有那些不对的请大家积极指出,一起学习!

原文地址:https://www.cnblogs.com/shenxm/p/7616177.html