1 概述

   

    我们常以为目录是个容器,放着目录和文件。实际上,目录是个映射表。人使用文件名来引用文件,计算机使用inode号码来引用文件。而目录则是文件名和inode号码之间的映射表。
 

    2 cp和inode

    用法

  cp [选项] 文件 [文件2|文件3...]  目标
  选项:
  -i              在覆盖文件前询问
  -r              递归地复制整个目录树
  -p              保留权限,所有者,和时间戳
  -a              -r和-p的结合


    cp命令必须总是至少有两个参数,如果给出的参数超过两个,除了最后一个参数以外的所有参数都会被解系成源文件

    目标影响cp的行为

            如果目标是目录,复制后的文件就会被放置其中
            如果目标是文件,复制后的文件就会覆盖目标
            如果目标不存在,复制后的文件就会被重命名为目标名

 

    inode角度

            1)分配一个未用的inode号码,在inode表中添加一个新项目
            2)在目录映射表创建一行,关联文件名和inode号码

 

    3 mv和inode

    mv的行为和cp相同,除了mv时,源文件会消失

    当一个文件mv后,构成这个文件的实际内容,不管是inode项目还是硬盘上的数据,都没有被转移。被转移的仅仅是目录映射表。

    两种情况

            1)目标和原文件在同一个文件系统
               a)在目录映射表新建一行
               b)删除带有源文件名的原有目录行


            2)如果目标是不同的文件系统
               mv的行为就是复制和删除

    案例

[root@think water]# ll -i w
3496568 -rw-r--r-- 1 root root 17 09-25 15:12 w
[root@think water]# mv w /home/water
[root@think water]# cd /home/water
[root@think water]# ll -i w
3496568 -rw-r--r-- 1 root root 17 09-25 15:12 w


    inode号码仍就一样。文件系统上的数据没转移,inode表没变,只不过其上的时间戳被更新

 

    4 rm和inode

       rm -r 删除目录及其内容,但每删一样之前都会询问
       rm -f 删除目录及其内容,但每删一样之前不会询问

 

    inode分析

            1)递减链接计数,从而释放inode号码,这个inode号码可以被重用
            2)把数据块挂到可用空间列表
            3)删除目录映射表中的相关行

 

    但是底层数据实际上没有被删除,只是当数据块被另一个文件使用时,原来的数据就会被覆盖

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐