linux下普通⽂件和⽬录⽂件区别详解
⽂件权限⼀般可认为是0 123 456 789,⼀共⼗位:
0:表⽰该⽂件的⽂件类型。Windows⾥⾯是使⽤了⼀种⽂件关联的技术,通过扩展名来关联相应的应⽤程序,使得双击某个⽂件,就能达到调⽤相应的应⽤程序来打开它的⽬的,这样简单快捷。然⽽对于⽤户来说,好处是⽅便,坏处是隐藏了⼀个实质性的东西:⽂件的真正的类型,与其扩展名实际上是毫⽆关联的。
举例来说:⼀个纯粹的⽂本⽂件,我可以给它命名“我的歌声⾥.mp3”,然后在win下双击,会调⽤相应的⾳乐播放器来打开,结果显⽽易见,肯定是错误的。那反过来,⼀个真正的MP3⽂件我也可以给它命名“花名册.txt”,在win下双击,⼀般会调⽤相应的⽂本编辑器来打开,不过我说你也知道,显⽰的⼀定是乱码。
上⾯两个例⼦是为了说明⼀个观点,某个⽂件真正的类型与其扩展名没⼀⽑钱关系。
那么在不知道⽂件扩展名的情况下,如何知道⽂件的类型呢?在Linux是这样的。
Linux中⽂件类型只有以下这⼏种:
1.-,普通⽂件。
2.d,⽬录⽂件,d是directory的简写。
3.l,软连接⽂件,亦称符号链接⽂件,s是soft或者symbolic的简写。
4.b,块⽂件,是设备⽂件的⼀种(还有另⼀种),b是block的简写。
5.c,字符⽂件,也是设备⽂件的⼀种(这就是第⼆种),c是character的⽂件。
Linux系统最原始的也只有这五种,所以第0位,只能是以上五者之⼀。
那么你会有疑问,
1.MP3⽂件是是哪种?答案:普通⽂件。
2.⼆进制⽂件是哪种?答案:普通⽂件。
3.⽂本⽂件是哪种?答案:普通⽂件。
4.为什么硬连接没有类型表⽰?答案:硬连接和软连接,名字上虽然只差⼀个字,本质完全不同,硬连接也是⽂件。其类型是普通⽂件。
为什么上⾯要说这么多呢?⽬的是为下⽂做知识铺垫。
那么 123-456-789 都好说,了解这块⼉的⼈都知道,他们只是⽤户-属组-其他这三组之间的区别,我们拿其中任意⼀组作为例⼦来讲解rwx皆可。
r:read,w:write,x:execute。
我们应该如何去记忆这两者之间的区别呢??难道死记硬背?NO。
我们应该知其然还得知其所以然,下⾯我试图从这查询⽂件以及内容的本质出发,来阐述rwx权限在这两者⾝上为何有不同的意义!
理解下⾯的所说的,需要关于Linux的⽂件系统的知识做铺垫。如果不知道inode这个概念,基本上就会很吃亏了。
再次强调,⽂件的内容和该⽂件当时所⽤的⽂件名毫⽆关联;该⽂件的类型,也与该⽂件当时的⽂件名,毫⽆关系。
查看⼀个⽂件的内容,实际上是这样的⼀个过程:
举例来说,你⽤了这个命令:cat /
1.你只传递了⼀个绝对路径,/,系统⾸先要知道/⽂件的inode是多少才⾏,如何得知呢?
2.记住⼀个规律,某⽂件的⽗⽬录会(记录)知道该⽂件的inode号!(此刻我想你是不是悟出⼀点什么了,不⽤急,接着往下看)
3.那么我得到“/”这个⽂件名,我得先知道/tmp⽬录的情况,要知道/tmp⽬录的情况,我得先知道/⽬录的情况,所以
我就可以从/⽬录开始(假设/⽬录的inode号是0,并且这是写死的),然后再去⼀张叫做inode-table的表中查inode号0所指向的数据域,然后从数据域⾥⾯可以到⼀些类似于下⾯的内容:(看起来像⼀张表,不是么?其实可以想象到,⽬录⽂件就是⼀张表,存储了它内部有哪些⽂件名,以及该⽂件名对应的inode号)
⽂件名 inode号
bin 18
var 19
tmp 20
... ...linux怎么读取文件内容
好了,我们从“/”,这个⽬录⽂件中到了“/tmp”⽂件名对应的inode号,就是20。(假设啊)
4.然后我们通过inode号20,去inode-table⾥⾯寻20对应的数据域,然后从数据域中,我们⼜会到⼀张表:(为什么⼜是表呢?因为“/”是⼀个⽬录,“/tmp”也是⼀个⽬录,那当然数据域⾥⾯存的还是表啦)
⽂件名 inode号
< 8899
bbb.mp3 10088
kkk.jpg 20000
... ...
好了,我们到了/的inode号了,就是8899。根据上⾯的规律,我们是不是⼜得去inode-table⾥⾯8899号对应的数据域了?对,就是这样。
5.我们到inode号8899对应的数据域,于是我们会发现如下⼀些内容:
“abcdefg”(假设⽂件内容就是这样)
...
⼜有疑问了,为⽑这次不是表了?
答案:/⽂件不是⽬录⽂件了,它是⼀个普通⽂件,他存储的⼀般都是⼀些字符串。
体现在本质上:
普通⽂件:存储普通数据,⼀般就是字符串。
⽬录⽂件:存储了⼀张表,该表就是该⽬录⽂件下,所有⽂件名和inode的映射关系。
从⽗⽬录中获得本⽂件的inode号---->到inode-table表中到这个inode号对应的数据域中的起点以及其他信息---->去这个数据域中读取该⽂件的内容(普通⽂件的内容⼀般是字符串,⽬录⽂件的内容是⼀张表)
如果你真⼼看懂上⾯我说的了,那么接下来就变得简单多了。
关键就是访问任何⼀个⽂件,要看是否能搞到inode号,搞不到就没辙了。搞到inode就好说了,拿着inode号去inode表中查即可,最后到数据域,那么就可以到⽂件的内容了
然后整个过程这不仅仅跟本⽂件权限有关,还跟它的⽗⽬录(还有⽗⽬录的⽗⽬录...)权限有关(是否能搞到本⽂件的inode)
体现在命令上:(话说这才是最实际的表象)
======
对于普通⽂件来说,rwx的意义是:
r:可以获得这个普通⽂件的名字和内容。
w:可以修改这个⽂件的内容和⽂件名。可以删除该⽂件,但是⽤户会得到是否删除写保护⽂件的prompt。
x:该⽂件是否具有被执⾏的权限。
======
对于⽬录⽂件来说,rwx的意义是:
r-x:可以进⼊cd该⽬录,可以获得该⽬录下存储情况,但是不能修改这个⽬录内部存储的⽂件(⽬录)的名字,也不能在该⽬录下新建⽂件和⽬录
-wx:可以进⼊cd该⽬录,但是看不到该⽬录下的存储情况(ls不可⽤),可以往该⽬录下添加、修改、删除⽂件。可以通过cat来读取该⽬录下的⽂件or⽬录的内容,由于得不到该⽬录下存储了那些⽂件,在不知情的情况下只能通过猜,cat + ⽂件名获得⽂件内容,所以这样依然不保密。
--x:可以进⼊cd该⽬录,看不到存储情况,也不能往该⽬录下添加、修改、删除⽂件。但是依然可以通过cat + xx(猜)来获得该⽬录下的⽂件的内容。
rw-:不能进⼊cd该⽬录,⽤ls仅仅可以获得⽂件名和⽬录名,因为获取不到这些⽂件的inode号,当然也不能获得该⽬录下的⽂件的内容。不能往该⽬录下添加、修改、删除⽂件。
======
最后总结⼀下吧:
1.⽬录⽂件虽然是⽂件(唉,谁叫Linux的核⼼理念就是Everything is file),但是存储内容的只是⼀张表⽽已,关于⽂件名和inode号的映射关系。
2.⽂件的扩展名和⽂件类型之间,没⼀⽑钱关系。
3.⽂件的⽂件名和⽂件实际存储内容之间,没⼀⽑钱关系。
4.要知道如何查到⼀个⽂件内容的过程。
5.为什么同⼀个⽂件系统移动⽂件要⽐跨⽂件系统快?
答:因为只需要修改某个⽬录中路径和inode对应关系即可,不需要重新写⼀遍数据域。
6.什么是买来的500G的硬盘,格式化完后总是少了达不到500G?
答:从本⽂可知,inode-table也是需要占⽤存储空间的,所以缺少的⼀部分中inode-table占⽤了不少。