linux 基础学习之一:文件管理

  1. 云栖社区>
  2. 博客>
  3. 正文

linux 基础学习之一:文件管理

长烟慢慢 2011-11-17 21:15:15 浏览751
展开阅读全文

1、目录与文件

首先我们要明白,对于文件和目录的权限是不同 的,同样是x权限,放在目录和文件上的意思不同。在这里杨老师给了一个最简单的理解,x可以理解问windows下的双击事件,对文件来说,可以执行;对目录来说,你可以进入这个目录。


执行ls -l 之后,不论是文件或者目录都会列出如下属性:

[root@localhost root]#ls -l 
total  5921

-rw-r--r--      1 root root 1581 11月 24 18:14 anaconda-ks.cfg 
drwxr-xr-x     2 root root 208 12月 1 13:50 babylinux 
-rw-r--r--      1 root root 1474560 11月 25 15:02 babylinux.img 
-rw-r--r--      1 root root 26829 11月 25 15:10 babylinux.png 
lrwxrwxrwx  1 root root 9 1月 4 11:06 disk1.link.png -> disk1.png 


下面分别解释其意思:

第1行:总用量(total) :这个数值是该目录下所有文件及目录列表第5个字段的和(以k为单位),也就是该目录的大小.请注意和该目录下的文件和子目录下文件的总合做区分.这个数字和du /root 得到的数字的大小是不一样的.可以用awk命令来验证.
用awk累加第5字段得到的数值:
[root@localhost root]# ls -l |awk 'BEGIN{sum=0}{sum+=$5}END{print sum}' 
4104092
转化成以K为单位:
[root@localhost root]# ls -l |awk 'BEGIN{sum=0}{sum+=$5}END{print sum/1024}' 
4007.9

可以看到累加第5个字段得到的值和total显示的是一样的(因为具体算法的不同,略微有差别).得到的数值实际上是root目录的大小(把root目录看成是一个特殊的文件,就可以理解什么是目录的大小).而用du得到的数值是root目录下所由文件和子目录下全部文件的大小的总合.

第1字段: 文件属性字段 

当为[ d ]则是目录
当为[ - ]则是文件
若是[ l ]则表示为连结文件(link file);
若是[ b ]则表示为装置文件里面的可供储存的接口设备;
若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标。
接下来的属性中,三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(excute):


第一组为『拥有人的权限』,以第 5 行为例,该档案的拥有人可以读写,但不可执行;
第二组为『同群组的权限』;
第三组为『其它非本群组的权限』。
范例:若有一个档案的属性为『-rwxr-xr--』,简单的可由下面说明之:
[-][rwx][r-x][r--]
1 234 567 890
1 为:代表这个文件名为目录或档案(上面为档案)
234为:拥有人的权限(上面为可读、可写、可执行)
567为:同群组使用者权限(上面为可读可执行)
890为:其它使用者权限(上面为仅可读)

上面的属性情况代表一个档案、这个档案的拥有人可读可写可执行、但同群组的人仅可读与执行, 非同群组的使用者仅可读的意思!


第2字段 :文件硬链接数或目录子目录数 

如果一个文件不是目录那么这一字段表示,这个文件所具有的硬链接数,即这个文件总共有多少个文件名.查看第一个文件:
-rw-r--r-- 1 root root 1581 11月 24 18:14 anaconda-ks.cfg
第2字段的值为1,说明这个文件只有anaconda-ks.cfg这一个文件名.即只有一个指向该链接的硬链接.
 
如果我用ln,做一个指向该文件的硬链接再查看该文件,该文件的第2字段就会变成2:
[root@localhost root]# ln anaconda-ks.cfg anaconda-ks.cfg.hardlink 
[root@localhost root]# ls -l 
总用量 4071 
-rw-r--r-- 2 root root 1581 11月 24 18:14 anaconda-ks.cfg 
-rw-r--r-- 2 root root 1581 11月 24 18:14 anaconda-ks.cfg.hardlink
此时,anaconda-ks.cfg 和anaconda-ks.cfg.hardlink 称为互为硬链接.他们指向同一个文件,无论是修改哪一个文件,另一个里也做相应的变化,因为实际上他们指向同一个文件.(与windows中的复制文件,有一定的区别,也不同与快捷方式。这种结构与linux中文件分属性与数据分开存储是相适应的)

ls -i anaconda-ks.cfg
可以查看它的文件节点(inode) 
互为硬链接的文件具有相同的文件节点. 以下是验证实验:
[root@localhost root]# ls -i anaconda-ks.cfg 
18102 anaconda-ks.cfg 
[root@localhost root]# ls -i anaconda-ks.cfg.hardlink 
18102 anaconda-ks.cfg.hardlink
可以看到,这两个文件具有相同的文件节点号:18102

如果你知道一个文件有多个文件名,如何查找他的其他文件名分布在什么地方呢?
可以先用ls -i 获得它的节点号,然后用find查找。
如/etc/sysconfig/networking/devices/ifcfg-eth0就具有多个文件名,我要查找与它互为硬链接的文件:
[root@localhost devices]# ls -i /etc/sysconfig/networking/devices/ifcfg-eth0 
147181 /etc/sysconfig/networking/devices/ifcfg-eth0
得到它的节点号为 147181 
再用find查找:
[root@localhost devices]# find /etc -inum 147181 
/etc/sysconfig/networking/devices/ifcfg-eth0 
/etc/sysconfig/networking/profiles/default/ifcfg-eth0
这样就得到了同一个文件的不同文件名的位置.
************************************* 
如果是一个目录,第2字段的含义: 
**************************************
如果是一个目录,则第2字段表示该目录所含子目录的个数. 
新建一个空目录,这个目录的第二字段就是2,表示该目录下有两个子目录.为什么新建的目录下面会有两个子目录呢? 
因为每一个目录都有一个指向它本身的子目录"." 和指向它上级目录的子目录"..",这两个默认子目录是隐藏的.用ls -a可以看到.
每次在目录下新建一个子目录,该目录第2字段的值就增1,但是新建一个普通文件该字段值不增加.


第3字段: 文件拥有者 

该字段表示这个文件是属于哪个用户的.UNIX类系统都是多用户系统,每个文件都有它的拥有者.只有文件的拥有者才具有改动文件属性的权利.当然, root用户具有改动任何文件属性的权利.对于一个目录来说,只有拥有该目录的用户,或者具有写权限的用户才有在目录下创建文件的权利.

如果某一个用户因为某种原因,被删除,而该用户的文件还存在,那么用ls -l 查看该文件将显示一个代表用户存在前ID号的数字.

以下是演示:

先创建一个用户并用su过去:

[root@localhost root]# useradd liu -g users 
[root@localhost root]# su - liu

用新建的用户创建一个测试文件:

[liu@localhost  home]$ touch testfile 
[liu@localhost  home]$ls -l testfile 
-rw-r--r-- 1 liu users 0 1月 4 16:31 testfile

最后用ls -l 看到第三字段的文件拥有者为liu

然后我将liu用户删除:

[root@localhost  root]# userdel liu 
[root@localhost  root]# cd /home/liu/ 
[root@localhost  liu]# ls -l 
总用量 0 
-rw-r--r-- 1 501 users 0 1月 4 16:31 testfile

可以看到,第三字段成了一个数字,这个数字是原liu用户的ID号.因为文件系统对每个文件记录文件所有者的ID,而非用户名.


第4字段: 文件拥有者所在的组 

组的概念可以想像成是一个共同完成一个项目的团队.通过组的概念,可以控制文件让特定的用户查看,修改或运行.而不是一棍子打死,要么全不让看,要么全让看.

一个用户可以加入很多个组,但是其中有一个是主组,就是显示在第4字段的明称.
可以在adduser的时候用-g指定该用户所在的主组,用-G指定其他组.

第5字段: 文件大小(以字节为单位) 
第5字段表示文件大小,如果是一个文件夹,则表示该文件夹的大小.请注意是文件夹本身的大小,而不是文件夹以及它下面的文件的总大小! 
很多人不能理解文件夹是一个特殊的文件的含义,这样的话理解文件夹大小的含义就比较困难了.

第6字段: 文件创建月份 . 
第7字段: 文件创建日期 
第8字段: 文件创建时间 
文件创建的时间可以通过touch命令来修改.如: 
#touch testfile 
可以把testfile的创建时间修改为当前时间. 
touch的详细用法请看链接文档. 
#man touch
另外,一个文件还有最后访问时间,最后修改时间等属性. 
这些属性可以用ls 的其它参数显示出来.

第9字段: 文件名 
如果是一个符号链接,那么会有一个 "->" 箭头符号,后面根一个它指向的文件名.


 2、修改文件的权限:

 chgrp: 改变文件所属群组。

     如将liu组的改为自己一个新键组的;“chgrp 新建组名 当前目录文件名” -R参数别忘了哈。


chown : 改变文件所属人。

恩恩,这个改变的时候也可以改变所属的群组,句法 :chown [-R] 账号名称 档案或目录名;

                                                                                               chown [-R] 账号名称: 群组名称  档案或者目录名

举例: chown liu2 4 ——4档案的拥有者改为liu2.。。 chown  liu2:9876 4——把档案4拥有者改为liu2,顺便把群组改为9876的群组。


chmod:改变文件的属性、suid、等等的特性;

这个比较好玩,分为数字类型和符号类型,具体操作很简单,不写了。书山说的太清楚了。

对于一个目录来说,拥有r权限,你就可以通过ls命令把其目录或者文件列出来。

如果拥有w权限,你可以做如下事情:a 建立新的文件与目录 b删除已经存在的文件与目录,即使你现在是liu用户,但是那个目录或者文件的拥有者是root也可以照删不误。c将已经存在的档案或者目录进行更名。 d搬移该目录内的档案或者目录的位置。



3、文件的读取与存储

linux中是怎么读取文件的呢?我们知道,每个档案不只有档案的内容,还包括档案的种种属性,所属群组,拥有者,能否执行,档案建立时间,所以linux中的档案时分成两部分来存储的,一部分是档案的属性,另一部分是档案的内容。属性放在inode中,内容放在block area中,那么,当具体读取一个文件的时候在是怎么读取的呢?以读取/etc/crontab这个档案为例说明:操作系统根据目录 / 的相关资料可取的 /etc  这个目录底下的所有档案的所有关联数据是放在哪一个block块的(估计可以理解为:这个块是一个inode的集合目录)前往该块读取档案关联性的内容(级实际要读取档案的inode块的序列号) 然后前往该inode,读取该inode的所有属性,并且可以根据inode的指向功能区访问对应的block area。。

我们看图来形象的说明读取一个文件的过程:

这样从目录找到对应的文件名(注意,目录里只有文件名和inode号,不会存数据)然后找到inode表,右图表示了inode表中的内容。根据inode表数据块


网友评论

登录后评论
0/500
评论
长烟慢慢
+ 关注