前言:
- linux文件系统是一个倒置树结构,从"/"开始,文件命名区分大小写,遵循FHS(Filesystem Hierarchy Standard)标准确保各个发行版拥有统一的目录结构。
- 执行
ls --color=auto
,不同类型文件的颜色不同。普通文件为灰色,目录文件为蓝色,可执行文件为绿色,压缩文件为红色,软链接文件为浅蓝色。
一、linux文件系统结构
-
linux文件系统结构如下图所示:
- 简要说明如下:
- /boot 系统启动文件
- /bin 普通用户使用的二进制可执行文件
- /sbin 系统管理员使用的二进制可执行文件
- /lib 系统启动时需要的库文件和内核模块文件
- /lib64 与64位系统有关的库文件
- /etc 配置文件
- /usr 非常重要的目录,储存可共享并只读的数据
- /root 系统管理员的家目录
- /home/user 普通用户的家目录
- /var 经常变化的数据
- /media 移动设备挂载点
- /mnt 临时挂载点
- /dev 设备文件,包含块设备和字符设备
- /tmp 临时文件
- /proc 内核信息,虚拟文件系统
- /sys 硬件信息,虚拟文件系统
- 在CentOS 7系统中,/lib, /lib64, /bin, /sbin四个目录已经变作软链接,实质上分别与/usr/lib, /usr/lib64, /usr/bin, /usr/sbin四个目录进行了合并,这也从另一个角度凸显/usr目录的重要性。
- 基名:路径最底层的文件或目录
- 目录名:路径除基名的剩余部分
basename /etc/rc.d/rc1.d <!--输出路径的基名,此命令结果为"rc1.d"-->
dirname /etc/rc.d/rc1.d <!--输出路径的目录名,此命令结果为"/etc/rc.d"-->
二、pwd 显示当前工作目录
pwd <!--显示当前工作目录的绝对路径-->
pwd -P <!--显示当前工作目录的真实物理路径-->
- 如下图,进入
/bin
目录,如果直接pwd
的话,显示结果即为/bin
;如果命令为pwd -P
,返回结果为链接指向的真实物理路径/usr/bin
- 绝对路径:从"/"开始描述文件位置路径
- 相对路径:相对当前工作目录或者某个参考点开始描述文件位置路径
三、cd 更改目录
- 语法:
cd 路径
cd .. <!--切换至当前目录的父目录-->
cd - <!--切换至上一次切换的目录,只能切换一次-->
cd ~ <!--切换至当前用户的home目录-->
cd -P 路径 <!--与pwd命令的-P选项类似,切换至真实物理路径--!>
-
cd -
功能实现:OLDPWD变量储存上一次切换至的目录,cd -
时直接读取$OLDPWD值即可
四、ls 列出目录内容
- 语法:
ls [options] [files_or_dirs]
ls -a <!--包含隐藏文件-->
ls -l <!--显示额外信息-->
ls -lh <!--文件大小使用K,M,G单位更方便阅读-->
ls -R <!--递归显示目录下一层内容-->
ls -r <!--逆序显示-->
ls -i <!--符号链接信息-->
ls -d <!--只显示目录信息-->
ls -1 <!--分行显示-->
ls –S <!--按从大到小排序-->
ls –t <!--按mtime排序-->
ls --time=atime <!--按atime排序-->
- 经常使用
ll
命令,它是ls -l --color=="auto"
的别名,可以方便查询目录内容的扩展信息 - 文件类型:
ll /bin/bash
命令结果如下
第1位显示"-"为普通文件。还有一些如下:"d"目录文件,"b"块设备文件,"c"字符设备文件,"l"符号链接文件,"p"管道文件,"s"套接字文件。
五、stat 查看文件状态
- 使用
stat
命令主要显示文件的元数据(metadata) - 文件的三个时间戳信息:
- atime(acess time) 访问时间,文件被读取视作访问;
- mtime(modify time) 修改时间 ,文件数据被修改视作修改;
- ctime(change time) 改变时间,文件元数据被修改视作改变。
- 由于文件读取属于经常性操作,频繁修改atime会降低系统性能,也没有实际意义。所以实际上atime每24h更新一次,或当ctime比atime更新时主动进行更新。
六、glob 文件通配符
- 通配符的使用可以加快操作速度,提高工作效率。
* <!--匹配零个或多个字符-->
? <!--匹配任何单个字符-->
~ <!--当前用户家目录-->
~mage <!--用户mage家目录-->
~+ <!--当前工作目录-->
~- <!-- 前一个工作目录-->
[0-9] <!--匹配数字范围-->
[a-z] <!--字母-->
[A-Z] <!--字母-->
[wang] <!--匹配列表中的任何的一个字符-->
[^wang] <!--匹配列表中的所有字符以外的字符-->
- 注意:
[0-9],[a-z],[A-Z]三个通配符里面的数字或字母不能倒叙写成[9-0],[a-z],[A-Z],会报错;
[a-z]指{a,A,b,B...y,Y,z}中的一个字母,[A-Z]指{A,b,B...Y,z,Z}中的一个字母,如果想要表示所有字母中的一个字母,建议使用下面提到的预定义字符类。
- 实验:
(1) 依次执行touch {a..z}.txt
touch {A..Z}.txt
touch {0..10}
命令,用ls
执行结果如下
(2)执行命令ls [z-a].txt
,系统报错
(3)执行命令ls [a-z].txt
和ls [A-Z].txt
,发现结果与预期不同
(4)想要确保把所有“1位小写字母.txt”的文件显示出来,最好用预定义字符类[:lower:]
,执行命令ls [[:lower:]].txt
,结果如下
- 预定义的字符类:
man 7 glob
[:digit:] 任意数字,相当于0-9
[:lower:] 任意小写字母
[:upper:] 任意大写字母
[:alpha:] 任意大小写字母
[:alnum:] 任意数字或字母
注意:
实际使用时注意还要再加一层括号,例如实现如下要求:显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录
ls /var/l*[[:digit:]]*[[:lower:]]
七、touch 创建空文件、刷新时间戳
- 若文件名不存在,则创建空文件;若文件名已存在,则刷新此文件的时间戳。
- 用法:
touch [OPTION]... FILE...
-a <!--仅改变atime和ctime-->
-m <!--仅改变mtime和ctime-->
-t [[CC]YY]MMDDhhmm[.ss] <!--指定atime和mtime的时间戳-->
-c <!--如果文件不存在,则不予创建-->
下图:使用-t
选项修改atime和mtime
八、cp 复制文件和目录
- 语法:
cp [OPTION]... SOURCE DEST
-
复制情况比较复杂,具体如下表
- 选项用法:
-i <!--覆盖前提示-->
-n <!--不覆盖-->
-r, -R <!--递归复制目录及内部的所有内容-->
-a <!--归档,相当于-dR --preserv=all-->
-d <!--不复制原文件,只复制链接名-->
--preserv[=ATTR_LIST] <!--保留属性——mode:权限,ownership:属主属组,timestamp:时间戳,links:链接,xattr,context,all-->
-P <!--不复制软链接指向的文件,指复制软链接文件本身-->
-p <!--preserv=mode,ownership,timestamp,保留权限、所有者、时间戳信息-->
-v <!--显示操作过程-->
-f <!--强制,如果已经存在的目标文件不能成功打开,删除它并重复cp操作-->
-
实验
在root账户下,登录hellopeiyang的家目录,建立aaa.txt的空文件,此时可以看到文件的所有者为root。切换为普通账户hellopeiyang,此时执行
cp /etc/issue aaa.txt
,由于aaa.txt文件所有者为root,无法执行覆盖操作。此时执行cp -f /etc/issue aaa.txt
,cp发现无法打开覆盖文件,遂删除之,并重新执行cp命令,可以看到root账户创建的文件被成功覆盖
九、mv 移动和重命名文件
- 语法:
mv [OPTION]... [-T] SOURCE DEST
- 当SOURCE与DEST在同一个目录下时,表明将文件名从SOURCE改为DEST
- 批量修改文件名 rename
rename '.txt' '.txt.bak' *.txt
十、rm 删除——危险命令
- 语法:
rm[OPTION]... FILE...
- 选项:
-i 交互式提示
-r 递归删除
-f 强制删除不提示 - 实验:磁盘占用率很高时的删除文件方法
(1)首先通过df -h
命令查看当前分区磁盘利用率,我们计划用dd
命令对/boot分区写入一个800M大小的文件test,形成/boot分区磁盘空间紧张的局面;
(2)文件生成后再次df -h
发现磁盘利用率已经达到96%之高,新开一个终端,在新会话中用vim打开test文件;
(3)此时使用rm -rf /boot/test
命令删除,使用ls
命令查询/boot下面已经没有test文件了,但是df -h
发现磁盘占用率依旧没有变化,此时此景已经束手无措;
(4)将另一个终端的vim退出,再次df -h
发现磁盘占用率终于降低了。证明当有进程使用文件时,即便文件已经删除,空间需要在进程结束后才能释放。
(5)重复构建磁盘高占用状态,此次使用> /boot/test
,用df -h
查看占用率情况,发现已经降低到正常水平,此时安心使用rm -rf /boot/test
删除文件
十一、目录相关操作
- tree 显示目录树
-d 只显示目录
-L level 指定显示的层级数目 - mkdir 创建目录
-p 一次性创建多层目录
-v 显示详细信息 - rmdir 删除空目录
-p: 递归删除父空目录
-v: 显示详细信息
删除有内容的目录时不能用rmdir
,使用rm -r
递归删除目录和文件
十二、索引节点(index node)
- 一个索引节点包含一个文件的所有元数据信息,所有索引节点构建的索引节点表涵盖分区内所有文件的元数据信息。
- 文件名引用一个索引节点号,通过查询索引节点表查询到文件数据存放位置。
- 目录包含目录下文件索引节点与文件名称的映射信息,所以目录下新增、删除文件都会对目录进行修改。
-
cp
命令分配一个空闲索引节点,将新建文件与该索引节点进行映射 -
rm
命令删除文件与其索引节点的映射从而释放索引节点,但并不立即删除数据。 -
mv
命令:- 功能为移动时,相当于
cp
和rm
操作 - 功能为重命名时,删除旧文件名与索引节点的映射,建立新文件名与索引节点的映射,期间索引节点没有变化(除时间戳)。
- 功能为移动时,相当于
- 分区挂载点inode编码规则:/proc /sys 虚拟分区为1,其他分区挂载点在CentOS 6下从2开始,在CentOS 7下从64开始。如下图为CentOS 7下分区挂载点inode号。
十三、ln 硬链接与软链接
- 硬链接新建一个文件名与一个已经存在的inode号映射,实际上是为一个文件另起一个名字。
- 语法:
ln filename linkname
*ln
命令只能生成文件的硬链接,目录的索引节点一定大于等于2,包含目录本身和目录下的.
文件,增加目录的索引节点只能通过新建目录实现。
- 软链接储存指向另一个文件的路径。
- 语法:
ln -s filename linkname
,注意filename的路径必须以linkname为依据填写相对路径。 -
实验:
(1)切换至/app目录,在当前目录下建立空文件aaa
(2)在当前目录建立文件aaa的硬链接bbb
(3)可以看到aaa和bbb两个文件完全相同
(4)在当前目录下建立子目录dir1
(5)在/app/dir1中建立软链接文件ccc,指向/app/aaa。aaa文件的路径是以当前目录为参考点相对路径
(6)发现软链接文件ccc出现了错误
(7)在/app/dir1中建立软链接文件ddd,指向/app/aaa。aaa文件的路径是以ddd文件的路径作为参考点的相对路径
(8)发现软链接文件ddd这次正常
- 硬链接与软链接的区别:
- 本质区别:硬链接是给一个文件取多个文件名,而软链接与原文件是2个不同的文件;
- 索引节点:给文件建立硬链接inode增加1,给文件建立软链接inode无变化;
- 是否跨分区:inode分区内唯一,无法跨分区建立硬链接,软链接无此要求;
- 修改:删除一个硬链接文件对文件本身无影响(只要不全部删除),删除软链接指向文件导致软链接文件出错。
十四、file 查看文件类型
-
file
命令通过读取文件前部内容(Magic Number)确定文件类型。 -
hexdump -C
以十六进制查看可执行文件