文件管理 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
: 仅显示不曾重复的行
上面几个命令的选项都是经常能用到了,其他大家可以根据情况自己查找。如下所示,一般就是查找些想要的数据:
有关文件内部的元数据和数据这里只是简单根据自己的理解说了下,有那些不对的请大家积极指出,一起学习!