目录
前言
这一篇文章主要介绍的是一些概念性的东西,指令不会在这里太多涉及,如果指令不熟悉的小伙伴,可以看看其他博主的常见指令总结!这一篇是我们学习Linux的基石,主要涉及原理多一点!
浅谈什么是文件?
如果我们新建了一个空文件 ,那么这个文件是否要占据磁盘的存储空间?
答案是肯定的,虽然一个文件的大小记录了该文件是0,但它指的0是文件内容为0,但文件除了文件内容以外,还具备有文件的属性,例如文件的修改时间,文件名,文件路径....,这些也是数据,既然是数据那么肯定就被计算机记录了下来!
于是我们就可以初步得出结论:文件=文件内容+文件属性
由上述结论我们可以得到一个新的结论:即当我们进行对文件的操作,一定要么是对文件内容进行操作,要么对文件属性进行操作
Linux下目录结构的认识及路径
在了解Linux下目录结构之前,我们先要了解一些前置东西
①、在Linux中,每一个目录文件都有两个隐藏文件“.”和“..”
“.”代表当前路径
“..”代表上级路径
②、依据我们的常识可以知道,目录文件之中可以放其他文件,这个文件可以是目录文件/普通文件...
目录结构
第一个问题:Linux下目录结构是怎么样的?
结论:Linux下目录结构是一颗多叉树!其中“/”目录我们称之为根目录
实际上要证明上述的结论我们需要证明两个东西,“/”是一个目录且“/”是根
若我们证明了上面两点,再依据目录之中还可以放目录的特点,我们就可以了解到它确实是一颗多叉树
1.“/”是一个目录
这一点我们可以通过ls -ld /,这个指令可以查看“/”文件的属性(若这个文件属性以d开头则就是目录文件)
2.“/”是所有目录文件的根
这个我们可以通过cd ..进行回退
我们随意进入一个目录文件,会发现不管进到哪个目录若是一直回退最终都会到了/目录且无法继续回退
再结合目录之中可以多个目录的特点,那么Linux的目录结构就是一颗多叉树并且"/"是他的根
如图所示:
这个多叉树有两个特点:
①、非叶子节点一定是目录文件
②、叶子节点可能是空目录也可能是普通文件
但虽然Linux的目录结构是一颗多叉树,但它不仅仅是一颗多叉树,它是一颗线索化的多叉树
如果我们把每一个目录文件当作一个节点,那么每个节点就有两个我们可以当成指针的东西一个指向当前节点也就是".",一个指向上级节点也就是".." (根目录的两个指针都指向自己)
而如果我们要在这颗树中找到一个节点,那也就牵扯到路径的概念了
路径
第二个问题:什么叫做路径?
对于上述路径:/dev/input/by-path
除了第一个/以外的所有/称为路径分隔符
两个/之间的一定是目录文件
而第一个/我们称之为根目录
其实路径本质上就是我们在这颗多叉树中要找到一个节点所经过的节点和路径分隔符所组成的一个字符串,从多叉树中我们能观察到,每一个节点都有唯一确定的父节点,并且父节点也有唯一确定的父节点(根节点的父节点就是自己),这就导致了找到一个文件的路径是被唯一标识的(唯一性)
但路径可以划分为绝对路径和相对路径,我们上面讨论的是绝对路径
绝对路径:以根目录开始的路径,这个路径是唯一标识的,并且这个路径不会依赖你现在所处的位置
例如:在上图中,如果要找到test.c,他所要经过的节点分别为/、home、bit、test.c,那么形成的路径就为/home/bit/test.c,它是以根目录开始的,所以它是绝对路径,这个路径不依赖你现在所处的位置的意思是若你在etc目录下,你可以直接通过这个绝对路径查看test.c的信息,若你在lib目录你也可以直接通过这个绝对路径查看test.c的信息
相对路径:不是以根目录开始的路径,这个路径会根据你现在所处的位置进行变化
补充:在Linux中,如果我们不写路径直接写文件名,那么默认是在当前路径下找这个文件
例如,若你现在是在lib目录下,当你要查看test.c时你应该先经过上级目录usr再经过根目录再经过home目录再经过bit目录最终到达test.c,这种情况下你形成的路径是../../home/bit/test.c
但若你现在是在etc目录下,当你要查看test.c时你应该先经过上级目录根目录再经过home目录再经过bit目录最终到达test.c,这种情况下你形成的路径时../home/bit/test.c
可以看到,上述两个例子中虽然都是到达test.c,但两种路径是根据你所处的位置而变化的,并且这种路径不是以/开头的,我们称他为相对路径
家目录
第三个问题:什么是家目录?
对于家目录其实不仅仅Linux有,Windows也有
当我们在Windows上登录一个用户以后,我们会默认打开桌面,对于图形化界面来说它是一个桌面,但其实本质它还是一个目录,这个桌面是存储在C:\Users\xxx\Desktop下的,所以桌面本质就是系统自动在你的家目录下创建了一个叫做桌面的东西
而对于Linux下的家目录,其实就是一个用户登录的时候默认所处的路径,未来你所写的代码,创建的文件,都建议统一放在自己的家目录下
什么是递归式的删除
我们上面说过,对于Linux的目录结构其实是一棵多叉树,这棵多叉树在系统中其实是用递归定义的,我们仔细想想递归定义的树,难道可以直接删除这棵树的根节点即视为删除吗?
肯定不可以,这样会造成大量节点没有释放,导致内存泄漏
于是我们只可以递归式的删除,所谓递归式的删除即深度优先遍历这棵多叉树,先删除叶子节点,再删除新的叶子节点以此往复
重定向
在了解接下来的内容之前,我们得先知道一个概念:Linux下一切皆文件!
换句话来说,不管是显示器、键盘等这样子的硬件,亦或是其他各种各样的什么东西在Linux下都是按照文件的方式来管理的,实际上,大部分的硬件设备,我们都能看做有读取和写入方法的,只不过有些方法可以为空,例如显示器只有写入方法,它的读取方法为空,再比如键盘只有读取方法而写入方法为空!
这么做是为了减少Linux系统的编码维护成本,它可以用管理文件的接口/调用来统一管理
输出重定向:
事实上,在Linux指令中有一个指令“echo”,它的功能是读取一个字符串打印到显示器上
我们上面说过,Linux下一切皆文件,那么上述指令换句话来说就是读取一个字符串写入到显示器文件,那么既然可以写入到显示器文件是否可以写到其他文件呢?答案是肯定的
这时就引入了我们的输出重定向“>”,如下用法
输出重定向“>”的第一个功能就是把一个本该写入到一个文件的数据写入到另一个文件,例如在上述指令中Hello,world本该被写到显示器上,但它却写到了test.txt文件
那么如果我重定向的是一个不存在