学了一段时间的Linux,最近也看了一些书籍,想着能够将Linux的水平再提高一点,就想着写一些博客对于一些知识的总结以及延伸。本篇文章,除了作者本身的一些Linux基础外,主要依据是《Linux命令行与shell脚本编程大全》,《鸟哥的Linux私房菜基础学习篇》。
学习环境:Red Hat 的 centos7.x。
想要学习Linux的文件系统,首先需要学习的是Linux文件的结构是怎样的。
1.Linux的文件结构
1.1文件结构简介
Linux的文件结构,用一句话来说就是:是一个从 / (根目录)开始的,一个有层次的树状目录结构,在这个根目录又有许多系统默认的目录。
详细解释:
Linux不同于windows是通过C,D,F等来区分文件存储在磁盘上的位置,也就是在C盘,D盘还是在F盘等。Linux是通过一个根目录组成的单个目录结构,所有的文件都存储在其中。所以我们不能通过看文件路径分辨出Linux中的文件存储在哪块磁盘上,所以这种目录结构也别称为虚拟目录。
当然想要查看一个文件具体存储在哪块磁盘上,也非常简单,直接通过lsblk命令就能看到。需要注意的一点在于,对于某个文件存储的磁盘,是需要从后往前看的,最先看到的目录挂载点就是文件的存储位置。
最后,为什么会默认生成许多默认的目录,原因就在于Linux的文件系统结构是UNIX演化而来,并且常见的目录名都是基于文件系统层次标准(FHS)。
1.2常见的文件结构
| 目录 | 功能 |
|---|---|
| / | 根目录,一般在下面都是些默认的目录,通常不会存储文件 |
| /root | root用户的家目录 |
| /home | 普通用户的家目录 |
| /etc | 存放一些软件的配置文件,包括系统的一些配置 |
| /var | 存放一些变化的文件,邮箱,日志等 |
| /dev | 存放一些设备文件,包括磁盘,鼠标等设备 |
| /usr | 存放一些系统文件,/usr/bin普通用户的命令,/usr/sbin超级管理员用户的命令 |
| /tmp | 存放一些临时文件 |
| /proc | 存放虚拟设备的目录 |
| /mnt | 提供手动挂载点 |
| /media | 存放媒体文件的目录 |
| /lib | 存放库文件 |
| /boot | 存放一些系统启动相关的文件 |
上述的目录也不用去强制记忆,随着学习和使用Linux过程,慢慢的对于Linux每个目录大体干什么就知道了。
1.3绝对路径和相对路径
绝对路径 :
绝对路径就是从/(根目录)开始的路径,例如/root/dir1/file1。
相对路径:
相对路径就是相对于当前目录下的路径,例如dir1/file1。
1.4Linux中文件的类型
Linux和window不同,Linux的文件不是通过后缀名来区分文件类型,在Linux中可以这么说,一切都是文件。那文件的类型呢,大体分为以下的七种:
- 普通文件,可以是文件、视频、图片,二进制文件等。
d 目录文件
l 链接文件(软连接)
s socket(套接字文件)
c 字符设备文件,打印机、终端 /dev/tty1、/dev/zero
b 块设备文件,存储设备:硬盘、U盘等 /dev/sda
p 管道文件
那如何查看文件的类型呢,有三种方式:
1.ll #通过ll指令,一般我用这个,第一个字段就是文件的类型
2.file 文件 #通过file命令
3.stat 文件 #查看文件的详细信息,后面接文件
2.文件的基本操作
注意:在Linux中一切都是文件,但是文件又有好几种类型,所以接下来的一些操作是针对特定的类型的,主要是目录以及文件。
2.1创建
2.1.1普通文件的创建
使用touch指令,最常用的一种创建文件的方式。当然了,也有一些指令会默认创建一些不存在的文件,比如说vim操作,或者一些>输出操作等。
例子:
touch file1 #创建单个文件
touch file1 #文件如果已经存在了,再次创建的话,改变文件的修改时间。
touch -a file1 #文件已经存在,加上-a参数,改变文件的访问时间。
也可以通过一些shell的通配符来批量创建文件:
touch file{1..10} #创建file1到file10
touch file{1,2,3} #创建file1,file2,file3
2.1.2创建目录
通过mkdir命令来创建目录,比较常见的创建目录的做法如下:
mkdir dir1 #创建一个空目录
mkdir -p dir1/dir2/dir3 # 递归创建目录,也就是一条命令创建了dir1,dir2,dir3
mkdir -v dir1 # 返回创建目录的详细信息
2.2删除
2.2.1 rm命令删除文件或目录
rm -r 目录名 # 递归删除目录
rm -f 文件或目录 # 强制删除,不添加的话,会在删除时询问是否删除,比较危险
rm -v 文件或目录 # 显示删除的详细信息
2.2.2空目录的删除rmdir
对于普通文件或者目录的删除,平常我用的比较多的还是rm指令,下面介绍一种针对空目录的一种删除方式rmdir。
rmdir 目录 # 删除空目录
rmdir -p 目录 #递归删除空目录 例如:rmdir -p dir1/dir2/dir3 dir1,dir2,dir3全部被删掉
2.3显示目录下的内容
2.3.1 ls指令
ls类指令的话,可以在后面接上文件名称,也可以直接使用,直接使用显示的是当前目录下的内容,pwd显示当前所在的目录。
ls #显示文件或目录下的内容
ls -l #等同于ll,以长格式显示文件或目录下的内容
ls -a #显示所有文件,包括以.开头的隐藏文件
l. #单独显示隐藏文件
ls --full-time #完整显示文件的时间
ls -d 目录 #显示目录本身而不是其中内容
ls -i #显示innode编号
2.3.2 ls -l(ll)命令下的返回值的详解
当我们在终端输入alias时,我们可以看到返回一连串的值,其中显示到ll指令等同于ls -l指令。alias指令用来命令别名的指令。
ll指令返回内容解释,以/root/anaconda-ks.cfg为例,输入ll返回:
-rw-------. 1 root root 1253 5月 22 2021 anaconda-ks.cfg
第一个字段:文件的类型
后续九个字段:每三位对应u,g,o的权限
后续的1:代表文件的硬链接总数
后续的root root:分别代表文件的属主和属组
1253:文件的大小(字节为单位)
后面就是时间:2021年5月22日
后面的anaconda-ks.cfg就是文件名
2.3.3前面提到的alias和链接详解
2.3.3.1 alias
alias是一个给用户自己定义命令的指令。
命令的格式 :
alias 自己定义的命令名称='输入一些命令'
例子:
alias wkx='echo "wkx is knowledgeable!!"'
注意:用上面的命令,仅仅只能代表当前会话层临时有效。
如果想要永久有效,要写入配置文件。
对于当前用户:
vim .bashrc
写入:
alias wkx='echo "wkx is knowledgeable!!"'
对于全局用户:
vim /etc/bashrc
写入:
alias wkx='echo "wkx is knowledgeable!!"'
注意:不管是全局用户还是当前用户,写入后要用source刷新一下文件或者退出当前会话重连才有效。本质上是因为你写入的文件中的命令,在shell启动是去读取的,所以原则上你写入任何一个shell启动时读取的文件就行。
查看别名:
alias #查看全部别名
type 指令 #查看指令是否是别名
取消别名:
unalias 别名 #临时取消
2.3.3.2软硬链接
软连接:
软链接就类似于快捷方式,访问这个快捷方式就可以访问到文件。它有自己单独的inode编号,它的block区里存放的是被链接文件的inode编号。
ln -sv 被链接文件 链接文件
例子:
ln -sv anaconda-ks.cfg file1
anaconda-ks.cfg 被链接文件
file1 链接文件
硬链接:
硬链接相当于,重新备份了一份文件,只是修改下名称,并且inode编号也是一样,并且也不会更改inode总数。
软连接和硬链接的不同:
- 删除时,软连接删除源文件链接文件失效,而链接文件删除任意一个都没事。
- 软连接有自己独有inode编号,和源文件不同,硬链接的inode编号与源文件一致。
- 软连接可以跨分区,而硬链接不行。因为跨分区inode编号重新分配,就不一样了。
- 软连接占用资源少,而硬链接占用资源倍增,相当于复制一份文件。
