zoukankan      html  css  js  c++  java
  • 文件管理 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: 仅显示不曾重复的行

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

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

  • 相关阅读:
    Go---第七章:接口(小知识点笔记)
    Go---第六章:方法(小知识点笔记)
    Go---第五章:函数(小知识点笔记)
    解决paramiko获取远程脚本延时返回数据的问题
    python字典合并
    关于iperf的使用
    python安装MySQLdb:出错Microsoft Visual C++ 9.0 is required
    v2r
    Win10 HotCorner热角小程序
    去掉显卡桌面右键菜单
  • 原文地址:https://www.cnblogs.com/shenxm/p/7616177.html
Copyright © 2011-2022 走看看