文件系统

image


linux下的文件类型

可以用ll查看,在ll列表最前面显示
-:普通文件
d:目录文件
b:块设备,以block块形式存储,比如硬盘就是一块一块写,随机寻找一块位置存放数据,一般都是有缓存的(先写入buffer缓冲区,注意和cache缓存的区别)
缓存或者缓冲的目的都是为了利用内存读写的速度快,比硬盘快,提高效率
c:字符设备,以字符character形式存储,比如键盘就是一个字符一个字符写,是按照次序输入的,不是随机,一般都没有缓存
l:符号链接设备
p:管道文件pipe,用于不同软件或者程序传播文件或者数据用,只能单向传输,现在很少用
s:套接字文件socket,可以双向同时传输

内存(用户内存区和内核内存区)和硬盘:
image


管道:
image


文件名规则

image


文件的不同后缀可以显示不同的颜色,可以自己定义,在/etc/DIR_COLORS
文件名可以用-等等特殊符号,但是最好别用,创建或者删除的时候必须用路径的方式才能创建或者删除 touch /data/ -a

绝对路径和相对路径

image


文件通配符

注意*不匹配隐藏文件,它可以代表0个或者任意个字符,而?代表一个字符,汉字也是一个字符
切换文件夹可以用cd - 但是如果访问文件只能cd ~-/####
通配符都是匹配文件名字的,其中的内容不能匹配
ls f[165]
image


中括号通配符匹配内只取一个字符,花括号相当于拆开的笛卡尔乘积(但注意花括号并不是通配符)
中括号通字符如果表示字母的范围时,是按照小写大写小写大写...的顺序来识别
man 7 glob 查询用法
因为中括号内只取一个 所以如果预定的字符类通配符注意外面再加一层括号(预定的字符类通配符看做是一个整体的字符即可)

21:57[root@centos7 /data]# touch f{1..10}.txt
21:58[root@centos7 /data]# ls 
f10.txt  f1.txt  f2.txt  f3.txt  f4.txt  f5.txt  f6.txt  f7.txt  f8.txt  f9.txt
21:58[root@centos7 /data]# ls f[167].txt
f1.txt  f6.txt  f7.txt
21:58[root@centos7 /data]# ls f[1-5].txt
f1.txt  f2.txt  f3.txt  f4.txt  f5.txt
21:59[root@centos7 /data]# ls f{1..10}.txt
f10.txt  f1.txt  f2.txt  f3.txt  f4.txt  f5.txt  f6.txt  f7.txt  f8.txt  f9.txt
21:59[root@centos7 /data]# ls f[1-10].txt
f1.txt
21:59[root@centos7 /data]# ls f[1-9].txt
f1.txt  f2.txt  f3.txt  f4.txt  f5.txt  f6.txt  f7.txt  f8.txt  f9.txt

22:00[root@centos7 /data]# rm -f *
22:02[root@centos7 /data]# touch f{a..z}.txt
22:03[root@centos7 /data]# ls
fa.txt  fd.txt  fg.txt  fj.txt  fm.txt  fp.txt  fs.txt  fv.txt  fy.txt
fb.txt  fe.txt  fh.txt  fk.txt  fn.txt  fq.txt  ft.txt  fw.txt  fz.txt
fc.txt  ff.txt  fi.txt  fl.txt  fo.txt  fr.txt  fu.txt  fx.txt
22:03[root@centos7 /data]# ls f[a-d].txt
fa.txt  fb.txt  fc.txt  fd.txt
22:03[root@centos7 /data]# ls f[wagfg].txt
fa.txt  ff.txt  fg.txt  fw.txt
22:03[root@centos7 /data]# ls f[^abcde].txt
ff.txt  fh.txt  fj.txt  fl.txt  fn.txt  fp.txt  fr.txt  ft.txt  fv.txt  fx.txt  fz.txt
fg.txt  fi.txt  fk.txt  fm.txt  fo.txt  fq.txt  fs.txt  fu.txt  fw.txt  fy.txt
22:04[root@centos7 /data]# touch f{A..Z}.txt
22:05[root@centos7 /data]# ls
fa.txt  fC.txt  ff.txt  fH.txt  fk.txt  fM.txt  fp.txt  fR.txt  fu.txt  fW.txt  fz.txt
fA.txt  fd.txt  fF.txt  fi.txt  fK.txt  fn.txt  fP.txt  fs.txt  fU.txt  fx.txt  fZ.txt
fb.txt  fD.txt  fg.txt  fI.txt  fl.txt  fN.txt  fq.txt  fS.txt  fv.txt  fX.txt
fB.txt  fe.txt  fG.txt  fj.txt  fL.txt  fo.txt  fQ.txt  ft.txt  fV.txt  fy.txt
fc.txt  fE.txt  fh.txt  fJ.txt  fm.txt  fO.txt  fr.txt  fT.txt  fw.txt  fY.txt
22:05[root@centos7 /data]# ls f[a-c].txt
fa.txt  fA.txt  fb.txt  fB.txt  fc.txt
22:05[root@centos7 /data]# ls f[A-C].txt
fA.txt  fb.txt  fB.txt  fc.txt  fC.txt
22:07[root@centos7 /data]# ls f[[:upper:]].txt
fA.txt  fD.txt  fG.txt  fJ.txt  fM.txt  fP.txt  fS.txt  fV.txt  fY.txt
fB.txt  fE.txt  fH.txt  fK.txt  fN.txt  fQ.txt  fT.txt  fW.txt  fZ.txt
fC.txt  fF.txt  fI.txt  fL.txt  fO.txt  fR.txt  fU.txt  fX.txt
22:08[root@centos7 /data]# ls f[[:lower:]].txt
fa.txt  fd.txt  fg.txt  fj.txt  fm.txt  fp.txt  fs.txt  fv.txt  fy.txt
fb.txt  fe.txt  fh.txt  fk.txt  fn.txt  fq.txt  ft.txt  fw.txt  fz.txt
fc.txt  ff.txt  fi.txt  fl.txt  fo.txt  fr.txt  fu.txt  fx.txt

image


image


索引节点

  • Linux里面数据保存以一个分区为一个整体来保存数据
  • Linux里面一块硬盘的一个分区在保存文件时,它的元数据和数据内容是分开保存的,其中元数据保存的地方在硬盘中叫inode(index node),索引节点
  • 其中一个分区大约有1%的空间分配用来保存索引节点,- 如果索引节点的节点编号可用数量被用光,则即使仍有空余空间也无法再创建新文件
  • 索引节点表:存放此分区上所有文件的索引节点的一个空间列表,其中列表中的每一项即对应着一个文件的索引节点,包含着这个文件的元数据
  • inode 就相当于C语言中的结构体 它包含了与文件系统中各个文件相关的一些不同类型的重要信息
  • 每一个索引节点都是一个表项,包含有关文件的信息(元数据):

    文件类型,权限,UID,GID
    链接数(指向这个文件名路径名称个数)
    该文件的大小和不同的时间戳
    指向磁盘上文件的数据块指针
    有关文件的其他数据

  • 其中包含的有一个inode number,用于区分不同的文件
  • 当文件引用时,会通过这个inode编号,找到其对应的inode,然后就可以在inode中找到此文件的所有元数据和数据存放位置(利用元数据中的指针)
  • 人是通过文件名来引用一个文件,计算机内则找它对应的inode number,然后找到inode,最终找到所有信息
  • 在目录中,目录下的文件名和文件inode号之间的映射表,组成了这个目录的内容
  • 分清楚三个不同的概念:索引节点列表inode table》索引节点index node》索引节点编号inode number
  • 索引节点内的节点编号仅用来区分不同文件,索引节点内的指针才能找到文件数据保存位置,索引节点编号具有唯一性,范围是在一个分区内
  • 可以用 ll -i 来查看节点编号
  • 可以用df -i (-h 更加易读的数据)查看剩余节点编号数量

image


image


目录

  • 目录也是一个文件,只不过是目录文件而已
  • 它也包含元数据,记录了各种信息,以及它的指针,指向它保存的数据
  • 目录文件数据块空间中保存的就是这个目录中的文件的名字和文件的inode number构成的列表
  • 文件名并不是元数据

    image


    image


cp和inode

在 CP的 命令:

  1. 分配一个空闲的inode号,在inode表中生成新条目
  2. 在目录中创建一个目录项(写在目录的数据块空间中),将文件名称与inode编号关联
  3. 拷贝数据生成新的文件

rm和inode

rm 命令:

  1. 链接数递减,从而释放的inode号可以被重用
  2. 把数据块放在空闲列表free中
  3. 删除目录项(文件名和它对应的节点编号)
    注意:数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
    注意:带有链接的文件只有当链接数全部删除为0之后,才会释放这个inode条目(这个节点编号就可以再次使用了)

mv和inode

  1. 如果mv命令的目标和源在相同的文件系统(linux中是在一个分区内,因为inode是按照分区划分的),作为mv 命令
  2. 用新的文件名创建对应新的目录项(对应此文件的节点编号)
  3. 删除旧目录条目对应的旧的文件名和对应的这个文件的节点编号
  4. 不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
  5. 如果目标和源在一个不同的文件系统,mv相当于cp和rm

硬链接

创建硬链接会增加额外的记录项以引用文件
对应于同一文件系统上一个物理文件
每个目录引用相同的inode号
创建时链接数递增
删除文件时:
rm命令递减计数的链接
文件要存在,至少有一个链接数
当链接数为零时,该文件被删除
语法:
ln filename [linkname ]
注意:不能用来备份,因为备份大多是物理层面,要存到其他地方
注意:不能创建目录的硬链接,因为可能造成循环嵌套
注意:不能跨越驱动器或分区(inode不能改变,只能改变其中的链接数)

软链接

一个符号链接指向另一个文件
ls - l的 显示链接的名称和引用的文件
一个符号链接的内容是它引用文件的名称(这个文件的绝对路径
软链接指向的是另一个文件的路径,其大小为指向的文件的路径字符串的长度,和原始文件大小没有关系
不增加或减少目标文件inode的引用计数
软链接指向的目标文件如果删除,则会报红字错误,但如果重新创建一个和原文件名一样的文件,则软连接又重新指向它,即便它并不和原文件相同
语法:
ln -s filename .. [linkname]
readlink 可以查看软链接的原始文件的路径

  • 软链接在生产中经常用来升级软件时的版本切换,不需要更改自己脚本中的代码
  • 也可以用来把比较深的路径定义比较短的路径,类似别名的效果
  • 还可以用来在更改了文件或者数据的路径之后,把老的文件夹目录指向新的文件目录,这样可以照顾旧程序中的引用目录直接到新目录中

注意:可以对目录进行软链接,也可以对文件进行软链接
假如是目录的软链接 用ll查看它的信息的时候不要加最后面的/,
不然即使加上-d选项,它也仅仅是显示软链接的连接目标目录的信息,而不会显示这个软链接文件本身的信息
同时注意目录的软链接:
"rm -f 目录软链接" 或者 "rm -rf 目录软链接" 都不会对原始文件造成影响,只是删除了这个目录软链接文件本身
但是 "rm -rf 软链接/ " 则对这个
目录软链接本身原始目录文件夹没有影响 ,但却把目录文件夹下的内容全部删掉了。这一点尤其要注意, 加上/ 和不加上/ 的区别
同时,如果是 " rm -rf 目录" 或者"rm -rf 目录/ " 则效果相同,都是把
目录本身以及它下面的所有文件和目录都删除掉了,更详细的rm 删除目录的区别详见 rm指令下
注意:如果是文件的软链接,则 "rm -f 文件软链接" 则删除掉这个软链接文件 对原始文件也没有影响。

注意:可以跨分区
注意:软链接还可以再对软链接进行链接
注意:创建软链接使用相对路径的时候,相对的是要创建的这个软链接的位置的路径,而不是当前工作目录的路径,不然会红字错误。创建软链接多使用相对路径(系统创建时用的就是相对路径)

附加知识点:.. 代表父目录 ../ 代表父目录下的 ../../ 代表父目录的父目录下的 可以一直加.. 并没有语法错误。
因为用ls -a查看文件夹下的所有文件时就有.. 和 . 所以..可一直嵌套下去

18:31[root@centos7 ~]# ll /data/slinktest
lrwxrwxrwx. 1 root root 16 Mar 10 18:21 /data/slinktest -> /data/textdir1/x
18:31[root@centos7 ~]# ll /data/slinktest/
total 0
drwxr-xr-x. 2 root root 6 Mar 10 11:07 a
drwxr-xr-x. 2 root root 6 Mar 10 11:07 b
18:32[root@centos7 ~]# ll /data/slinktest/ -d
drwxr-xr-x. 4 root root 24 Mar 10 11:07 /data/slinktest/
18:32[root@centos7 ~]# ll /data/slinktest -i -d /data/textdir1/x
     123 lrwxrwxrwx. 1 root root 16 Mar 10 18:21 /data/slinktest -> /data/textdir1/x
33555680 drwxr-xr-x. 4 root root 24 Mar 10 11:07 /data/textdir1/x
18:33[root@centos7 ~]# ll /data/slinktest/ /data/textdir1/x/
/data/slinktest/:
total 0
drwxr-xr-x. 2 root root 6 Mar 10 11:07 a
drwxr-xr-x. 2 root root 6 Mar 10 11:07 b

/data/textdir1/x/:
total 0
drwxr-xr-x. 2 root root 6 Mar 10 11:07 a
drwxr-xr-x. 2 root root 6 Mar 10 11:07 b

软硬链接的区别总结:

  • 本质:
    硬链接:一个文件多个名字
    软链接:一个文件的不同的快捷方式,不同的文件
  • 链接数:元数据中链接数只有硬链接增长,软连接不会
  • 跨分区:硬链接不支持,软连接支持
  • 目录文件:硬连接不可以链接目录文件,软连接可以
  • 原始文件和链接文件的关系:
    硬链接是独立平等的关系,删除不影响其他的硬链接(相当于删除了一个文件名)
    软连接依赖于原始文件,删除原始文件则软链接报错
  • 大小:硬链接都是同一个文件,大小相同;软链接的大小取决于它指向的原始文件的路径的字符数量

确定文件内容

  • linux中文件类型不看后缀, 即使修改后缀也对原文件没有影响,比如修改 cat 为 cat.txt 仍然可以使用
  • 文件可以包含多种类型的数据
  • 检查文件的类型,然后确定适当的打开命令或应用程序使用
  • file [options] <filename>...

    常用选项:
    -b 列出文件辨识结果时,不显示文件名称
    -f filelist 列出文件filelist中文件名的文件类型
    -F 使用指定分隔符号替换输出文件名后默认的”:” 分隔符
    -L 查看对应软链接对应文件的文件类型
    --help 显示命令在线帮助