一、树状结构
在 Linux 操作系统中,所有的文件和目录都被组织成以一个根节点“/”开始的倒置的树状结构。
目录相当于 Windows 中的文件夹,目录中存放的既可以是文件,也可以是其他的子目录,而文件中存储的是真正的信息。
文件系统的最顶层是由根目录开始的,系统使用“/”来表示根目录,在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含(子)目录或文件。如此反复就可以构成一个庞大的文件系统。
其实,使用这种树状、具有层次的文件结构**(FHS:文件系统层级标准)主要目的是方便文件系统的管理和维护**,想象一下,如果所有的文件都放在一个目录下,其文件系统的管理和维护将变成一场噩梦。
注意,目录名或文件名都是区分大小写的,如 dog、DOG 和 Dog 为 3 个不同的目录或文件。完整的目录或文件路径是由一连串的目录名所组成的,其中每一个目录由“/”来分隔。
在文件系统中,有两个特殊的目录,一个是用户所在的工作目录,即当前目录,可用一个点表示;另一个是当前目录的上一层目录,也叫父目录,用两个点表示。
指明一个文件存放的位置,有 2 种方法,分别是使用绝对路径和相对路径
绝对路径一定是由根目录 / 开始写起。相对路径不是从根目录 / 开始写起,而是从当前所在的工作目录开始写起。
二、命令提示符
登录系统后,第一眼看到的内容是:
[root@localhost ~]#
这就是 Linux 系统的命令提示符。那么,这个提示符的含义是什么呢?
[]:这是提示符的分隔符号,没有特殊含义
root:显示的是当前的登录用户,笔者现在使用的是 root 用户登录
@:分隔符号,没有特殊含义
localhost:当前系统的简写主机名(完整主机名是 localhost.localdomain)
~:代表用户当前所在的目录,此例中用户当前所在的目录是家目录
#:命令提示符,Linux 用这个符号标识登录的用户权限等级。如果是超级用户,提示符就是 #;如果是普通用户,提示符就是 $
家目录(又称主目录)是什么? Linux 系统是纯字符界面,用户登录后,要有一个初始登录的位置,这个初始登录位置就称为用户的家:
超级用户的家目录:/root
普通用户的家目录:/home/用户名
切换目录
[root@localhost ~]# cd /usr/local
[root@localhost local]#
仔细看,如果切换用户所在目录,那么命令提示符中的 ~ 会变成用户当前所在目录的最后一个目录(不显示完整的所在目录 /usr/ local,只显示最后一个目录 local)。
Linux 命令按照来源方式,两种分别是 Shell 内置命令和外部命令。所谓 Shell 内置命令,就是 Shell 自带的命令,这些命令是没有执行文件的;而外部命令就是由程序员单独开发的,所以命令会有执行文件。
三、命令的基本格式
[root@localhost ~]# 命令 [选项] [参数]
[]中的代表可选项,即有些命令可以不写选项或参数,也能执行
选项的作用是调整命令功能,没有选项,那么命令只能执行最基本的功能;而一旦有选项,则可以显示更加丰富的数据
有短选项(-l)和长选项(–all)之分。短选项是英文的简写,用一个减号调用;长选项是英文完整单词,一般用两个减号调用。
参数的作用是用于指定命令操作的对象是谁,一般文件、目录、用户和进程等可以作为参数被命令操作;命令一般都需要加入参数,如果省略参数,则一般都有默认参数。
四、基础命令
cd命令:切换目录, Change Directory 的缩写
pwd命令:显示当前路径, Print Working Directory (打印工作目录)的缩写
ls 命令:主要功能是显示当前目录下的内容,list 的缩写,是最常见的目录操作命令
[root@localhost ~]# ls [选项] 目录名称
touch命令:创建普通文件及修改文件时间戳
[root@localhost ~]# touch [选项] 文件名
-a: 只修改文件的访问时间
-m:只修改文件的数据修改时间
-c: 仅修改文件的时间参数(3 个时间参数都改变),如果文件不存在,则不建立新文件。
-d: 可以跟欲修订的日期,而不用当前的日期,即把文件的 atime 和 mtime 时间改为指定的时间。
-t: 可以跟欲修订的时间,而不用目前的时间,时间书写格式为 YYMMDDhhmm。
Linux 系统中,每个文件主要拥有 3 个时间参数(通过 stat 命令进行查看),分别是文件的访问时间、数据修改时间以及状态修改时间:
访问时间(Access Time,简称 atime):只要文件的内容被读取,访问时间就会更新
数据修改时间(Modify Time,简称 mtime):当文件的内容数据发生改变,此文件的数据修改时间就会跟着相应改变
状态修改时间(Change Time,简称 ctime):当文件的状态发生变化,就会相应改变这个时间。例如文件的权限或属性改变
mkdir命令:创建目录(文件夹),是 make directories 的缩写,此命令所有用户都可以使用。
[root@localhost ~]# mkdir [-mp] 目录名
-m :用于手动配置所创建目录的权限,而不再使用默认权限
-p : 递归创建所有目录,以创建 /home/test/123为例,在默认情况下,你需要一层一层的创建各个目录,而使用 -p 选项,则系统会自动帮你创建 /home、/home/test 以及 /home/test/123
rmdir命令:删除空目录,remove empty directories 的缩写,只能删除空目录
[root@localhost ~]# rmdir [-p] 目录名
-p : 用于递归删除空目录
rm命令:删除文件或目录,rm 是强大的删除命令,它可以永久性地删除文件系统中指定的文件或目录
[root@localhost ~]# rm[选项] 文件或目录 (一般用 -rf )
-r:递归删除,主要用于删除目录,可删除指定目录及包含的所有内容,包括所有的子目录和文件
-f:强制删除(force),不询问,而是直接删除目标文件或目录
-i:系统会询问,可以有效防止不小心删除有用的文件或目录。不加选项,默认询问
mv命令:移动文件或改名,move 的缩写,等同windows中的剪切,源文件会被删除,既可在不同目录之间移动文件或目录,也可在同一目录之间重命名文件或目录
[root@localhost ~]# mv 【选项】 源文件 目标文件
-f:强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖
-i:交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项)
-v:显示文件或目录的移动过程
cp命令:复制普通文件和目录,copy的缩写,
[root@localhost ~]# cp [选项] 源文件 目标文件
-r:递归复制,用于复制目录,不加参数用于复制普通文件
-i:询问,如果目标文件已经存在,则会询问是否覆盖;
-l:把目标文件建立为源文件的硬链接文件,而不是复制源文件;
-s:把目标文件建立为源文件的软链接文件,而不是复制源文件;
[root@localhost ~]# cp cangls /tmp/
#把源文件不改名复制到 /tmp/ 目录下
[root@localhost ~]# cp cangls /tmp/bols
#改名复制
五、简化输入
自动补全功能:不仅适用补全文件名,也适用于所有 Linux 命令,连按2 次 Tab 键时,Shell 会罗列出所有以 “ca” 开头的 Linux 命令
通配符:匹配任意数量的字符。? 匹配任意一个字符。[]* 匹配括号内的任意一个字符,甚至 [] 中还可以包含用 -(短横线)连接的字符或数字,表示一定范围内的字符或数字
[root@localhost test]# ls a* <–匹配所有以 a 字符开头的文件名
apple
[root@localhosttest]# ls gt <–匹配所有以 g 字符开头,以 t 字符结尾的文件名
grapefruit
[root@localhosttest]# ls e <–匹配所有包含 e 字符的文件名
apple grape grapefruit watermelon
[root@localhost test]# ls n <–匹配所有包含 n 字符的文件名
banana watermelon
[root@localhost test]# ls ???e <–匹配任意包含 4个字符但以 e 结尾的文件
apple grape
[root@localhost test]# ls g???e <–匹配任何以 g 开头且第 5 个字符为 e 的文件
grape grapefruit
[root@localhost test]# ls [abw]* <–匹配任何以 a、b 或 w 开头的文件
apple banana watermelon
[root@localhost test]# ls [agw][ne] <–匹配任何以 a、g、w 开头同时以 n 、e 结尾的文件名
apple grape watermelon
[root@localhost test]# ls [a-g] <–匹配以字母 a 到 g 之间任何一个字母开头的文件名
apple banana grape grapefruit
六、命令的执行过程
分为如下 4 个步骤
1) 判断路径
判断用户是否以绝对路径或相对路径的方式输入命令(如 /bin/ls),如果是的话直接执行。
2) 检查别名
检查用户输入的命令是否为“别名命令”。 alias 命令可以给现有命令自定义别名,即用一个自定义的命令名称来替换原本的命令名称。
例如,我们经常使用的 rm 命令,其实就是 rm -i 这个整体的别名,可以使用 unalias 命令,将别名删除掉
[root@localhost ~]# alias rm
alias rm=‘rm -i’
[root@localhost ~]# unalias rm
[root@localhost ~]# rm a.txt
[root@localhost ~]# <–直接删除,不再询问
3) 判断是内部命令还是外部命令
命令行解释器(又称为Shell)会判断用户输入的命令是内部命令还是外部命令。其中,内部命令指的是解释器内部的命令,会被直接执行;而用户通常输入的命令都是外部命令,这些命令交给步骤四继续处理。
内部命令由 Shell 自带,会随着系统启动,可以直接从内存中读取;而外部命令仅是在系统中有对应的可执行文件,执行时需要读取该文件。
判断一个命令属于内部命令还是外部命令,可以使用 type 命令实现。例如:
[root@localhost ~]# type pwd
pwd is a shell builtin <-- pwd是内部命令
[root@localhost ~]# type top
top is /usr/bin/top <-- top是外部命令
4) 查找外部命令对应的可执行文件
当用户执行的是外部命令时,系统会在指定的多个路径中查找该命令的可执行文件,而定义这些路径的变量,就称为 PATH 环境变量,其作用就是告诉 Shell 待执行命令的可执行文件可能存放的位置,也就是说,Shell 会在 PATH 变量包含的多个路径中逐个查找,直到找到为止(如果找不到,Shell 会提供用户“找不到此命令”)。
七、变量
是计算机系统用于保存可变值的数据类型,可通过变量名称来提取到对应的变量值,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等。Linux 系统中环境变量的名称一般都是大写的,使用 env 命令来查看到 Linux 系统中所有的环境变量
在讲解 PATH 环境变量之前,首先介绍一下 which 命令,它用于查找某个命令所在的绝对路径
[root@localhost ~]# which rm
/bin/rm
[root@localhost ~]# which rmdir
/bin/rmdir
PATH 环境变量的内容是由一堆目录组成,各目录之间用冒号“:”隔开。当执行某个命令时,Linux 会依照 PATH 中包含的目录依次搜寻该命令的可执行文件,一旦找到,即正常执行;反之,则提示无法找到该命令。