一、概念
Linux命令分为内部命令与外部命令两种。两个命令功能基本相同,但其在linux系统中的被调用方式略有差别。所谓的内部与外部之分是相对于Shell本身来区分的,内部命令集成与Shell解释器程序内部的一些特殊指令也称为内建(Built-in)指令,属于Shell的一部分,没有单独对应的系统文件,自动加载入内存,可以之间使用;外部命令是Linux系统中能够完成特定功能的脚本文件或二进制程序,外部命令是属于Shell解释器程序之外的命令,每个外部命令对应系统中的一个文件,需要知道对应的文件位置,由Shell加载后才能执行。
内部命令 | 外部命令 |
集成于Shell解释器程序内部的一些特殊指令,也称为内建(Built-in)指令 | Linux系统中能够完成特定功能的脚本文件或二进制程序 |
属于Shell的一部分 | 属于Shell解释器程序之外的命令 |
没有单独对应的系统文件 | 每个外部命令对应了系统中的一个文件 |
自动载入内存,可以直接使用 | 必须知道其对应的文件位置,由Shell加载后才能执行/bin,/usr/bin,/usr/local/bin等 |
那什么是Shell呢?
Shell是在Linux系统中运行的一种特殊程序,位于用户层与内核之间,主要功能是翻译用户指令,并将命令翻译成计算机语言,传递给内核执行调用相关资源,也可以说充当“翻译官”的作者。用户登陆Linux系统的时候会自动加载某个Shell程序,其中bash是默认的Shell程序,文件位于“/bin/bash”。
以虚拟机登陆Linux系统为例子,登陆时自动加载的Shell程序,显示为以下
如何分辨内部命令与外部命令?
查看内部命令的两个命令:enable和help。
[root@192 ~]# enable
enable .
enable :
enable [
enable alias
enable bg
enable bind
enable break
enable builtin
enable caller
enable cd
enable command
enable compgen
enable complete
enable compopt
enable continue
enable declare
enable dirs
enable disown
enable echo
enable enable
enable eval
enable exec
enable exit
enable export
enable false
enable fc
enable fg
enable getopts
enable hash
enable help
enable history
enable jobs
enable kill
enable let
enable local
enable logout
enable mapfile
enable popd
enable printf
enable pushd
enable pwd
enable read
enable readarray
enable readonly
enable return
enable set
enable shift
enable shopt
enable source
enable suspend
enable test
enable times
enable trap
enable true
enable type
enable typeset
enable ulimit
enable umask
enable unalias
enable unset
enable wait
而想要知道一个命令属于内部命令还是外部命令就需要引入另一个命令:type
格式为:type 命令字
结果显示在下方,如果显示的为“ ***是shell的内嵌 ”,则该命令为内部命令。如type本身就属于一个内部命令。同样的,enable和help这两个命令也是属于内部命令。
结果显示在下方,如果显示的为“ ***是/*/*/*.... ”,则该命令为外部命令。如mkdir和touch这两个命令属于外部命令。(mkdir为创建空目录命令;touch为创建空文件指令)
P.S.:cd命令既属于内部命令也属于外部命令,直接使用type命令查看时,会显示为内嵌;而当使用“enable -n cd”命令禁用内部命令后,再用“type cd”查看的时候下方会显示命令的具体路径。而有的外部命令存在但在使用时却显示未查找到,则需要检查该外部命令是否存在于环境变量PATH所包含的目录路径中,环境变量PATH是控制系统加载命令的路径,详细内容在后续章节“Shell”中阐述。
路径的分类
分为绝对路径和相对路径
分类 | 表现形式 | 说明 | 示例 |
绝对路径 | 写全路径 | 表示以根目录为起点的路径 | /usr/local/bin/cfssl |
相对路径 | 直接使用目录名或文件名 | 表示当前工作目录中的子目录、文件的位置 | xxx |
以一个点号“.”开头
| 表示以当前目录的上一级目录(父目录)作为起点 | ./xxx | |
以两个点号“..”开头 | 表示以当前目录的上一级目录(父目录)作为起点 | ../xxx | |
以“~”形式开头 | 表示以指定用户的宿主目录作为起点 | ~/xxx | |
以“~用户名”形式开头 | 表示以当前用户的宿主目录作为起点 | ~用户名/xxx |
文件的分类
硬链接文件和软连接文件
文件类型 | 软链接文件 | 硬链接文件 |
删除源文件后 | 失效 | 仍然可用(文件占用空间与源文件相同) |
使用范围 | 适用于文件或目录 | 仅适用于文件 |
保存位置 | 与源文件可在不同的文件系统中 | 必须与源文件在同一个文件系统(即同一个分区)中 |
与源文件的关系 | 相当于快捷方式 | 相当于给文件起个别名 |
inode号码 | inode号码不同 | inode号码相同 |
二、常用命令
1 pwd命令
[root@用户名 ~]pwd
用于显示用户当前所在的工作目录路径。在工作中我们经常不断进入到深层目录中去进行操作,而我们输入的命令行前的括号内只显示当前目录,为了不与其他文件或目录中的同名文件搞混,使用pwd命令可以直接查找到我们当前所在具体路径。
2 cd命令
[root@用户名 ~]cd 目标位置 #切换到目标位置
[root@用户名 ~]cd ~ #
[root@用户名 ~]cd #切换到当前家目录
[root@用户名 ~]cd - #切换到上一次cd之前的目录
用于切换目录,还是以pwd中的目录为例
切换到目标位置
切换到当前家目录
切换上一次cd之前的目录
3 ls命令
[root@192 ~]# ls 选项 目录或文件
用于显示目录中内容,包括子目录和文件相关属性信息
我们先来分析ls以长格式查看命令显示的字段表示的含义
ls -l显示文件属性一共有 7 个字段
文件类型+权限位 | 文件硬链接数/目录的子目录数 | 属主 | 属组 | 文件大小 | 文件修改时间 | 文件名 |
-rw-r--r-- | 1 | root | root | 0 | 4月10日14:.00 | txt1 |
其中文件类型字段开头为“-”为普通文件,开头为“d”为目录,开头为“l”为软连接文件,rwx代表权限位:r为只读(值为4),w为只写(值为2),x为可执行(值为1),通常深蓝色表示目录,白色表示不同文件,绿色表示可执行文件,黄色代表设备文件,红色代表压缩文件
ls常用选项
-l | 以长格式的形式显示文件/子目录的属性 |
-a/-A | 显示目录中所有的隐藏文件,-A不显示 . 和 .. |
-h | 以人性化的方式显示文件/子目录大小(默认单位为字节) |
-d | 查看目录本身 |
-R | 以递归的方式显示目录中所有子目录的内容 |
-t | 以时间排序显示,默认从最新到最老的方式 |
-r | 反向排序 |
-i | 显示文件/目录的 inode 号 |
结合通配符
“?”代表任意一个字符,有且一个字符
“*”代表任意数个字符,可以是0个或者1个或者多个
“[]”:表示可以匹配字符组中的任意一个字符[abc]、[a-f]
4 alias命令
查看别名命令
别名命令,通过别名机制简化常用、较长的命令
[root@192 ~]# alias 命令别名='命令' #=两边不能有空格
[root@192 ~]# unalias 命令别名 #取消别名
5 du命令
用来统计指定目录或文件所占磁盘空间大小
[root@192 ~]# du 选项 文件或目录
常用选项
选项 | 说明 |
-a | 统计目录及其所有子目录和文件的占用大小 |
-h | 仅统计目录本身的占用大小,不能和 -a 选项同时使用 |
-s | 以人性化的方式显示占用大小(默认单位为KB) |
--max-detph=n | 仅统计目录中的第n层子目录的占用大小 |
例如查看统计目录中第1层目录占用大小
[root@192 ~]# du -h --max-detph=1 文件路径 #查看该文件路径下的第一层目录
或
[root@192 ~]# du -d 1 文件路径 | sort -n
6 mkdir 与 touch命令
mkdir用于创建空白目录
[root@192 ~]# mkdir 选项 目录位置及名称 #创建空目录
[root@192 ~]# mkdir -p 选项 /*/*/*/* #创建嵌套的多层目录
或
[root@192 ~]# mkdir -p 选项 * * * * #创建多个目录
[root@192 ~]# mkdir -p 选项 {1..100} #创建100个目录
touch用于创建空白文件或更新文件的时间标记
[root@192 ~]# touch 文件...
例:touch aa bb cc dd #创建名为aa bb cc dd的文件
touch {aa,bb,cc,dd}.txt #创建txt文件
touch {1..10}
7 ln命令
创建链接文件为文件或目录建立链接文件,类似于Windows系统的快捷方式
[root@192 ~]# ln -s 源文件或目录 链接文件或目标位置 #创建软链接文件
[root@192 ~]# ln 源文件或目录 链接文件或目标位置 #创建硬链接文件
8 cp命令
将需要复制的文件或目录(源)重建一份,并保存为新的文件或目录
[root@192 ~]# cp 选项 源文件或目录 目标文件或目录
常用选项
-f | 覆盖目标同名文件或目录时不进行提醒,而直接强制复制。 |
-i | 覆盖目标同名文件或目录时提醒用户确认。 |
-p | 复制时保持源文件的权限、属主及时间标记等属性不变。 |
-r | 复制目录时必须使用此选项,表示递归复制所有文件及子目录。 |
复制多个文件或目录时,目标位置必须时目录,且目标目录必须存在
cp前加\表示使用原生cp命令
9 rm命令
删除指定的文件或目录
[root@192 ~]# rm 选项 要删除的文件或目录
常用选项
-f | 删除文件或目录时不进行提醒,而直接强制删除。 |
-i | 删除文件或目录时提醒用户确认。(y表示删除,n表示不删除) |
-r | 删除目录时必须使用此选项,表示递归删除整个目录树(应谨慎使用)。 |
注:复制多个文件或目录时,目标位置必须是目录,且目标目录必须已存在。不要直接删除系统中已有的目录或配置文件,以避免出现意外故障。且禁止使用“ sudo rm -rf /* ”命令!!!!!
删除目录下文件时建议最好先切换到目录下再执行rm -rf命令
10 mv命令
将指定的文件或目录转移位置如果目标位置与源位置相同,则相当于执行重命名操作
[root@192 ~]# mv 选项 源文件或目录 目标文件或目录
rename批量修改文件名
[root@192 ~]# rename 旧字符 新字符 目标文件
例子:rename jpg gif *.jpg
11 whcih
查找命令文件存放路径
12 find
递归的方式,根据目标的名称、类型、大小等不同的属性进行精细查找
[root@192 ~]# find 查找范围 查找条件表达式
查找类型 | 关键字 | 说明 |
按名称查找 | -name | 根据目标文件的名称进行查找,允许使用”*“及“?”通配符 |
按文件大小查找 | -size | 根据目标文件的大小进行查找 一般使用“+"”-”号设置超过或小于指定的大小作为查找条件常用的容量单位包括kB(注意k是小写)、MB、GB |
按文件属主查找 | -user | 根据文件是否属于目标用户进行查找 |
按文件类型查找 | -type | 根据文件类型进行查找 文件类型包括普通文件(f)、目录(d)、块设备文件(b)、字符设备文件(c)等块设备文件(b):成块读取数据的设备(硬盘,内存,光驱)字符设备文件(c):按单个字符读取数据的设备(键盘,鼠标) |
使用 find 命令可以实现多个查找条件 各表达式之间使用逻辑运算符
-a 表示 而且(and)
-o 表示 或者(or)
find之exec用法
-exec参数后面跟的是Linux命令,它是以分号“:”为结束标志,由于各个系统中分号会有不同的意义,因此在分号前面加上反斜杠转义符“、”{}代表前面find查找出来的文件名
find 命令匹配到了当前目录下的所有普通文件,并在-exec 选项中使用 ls-命令将它们列出
find ./ -type f -exec ls -l {} \;
find ./ -metime +/- 30 代表查找当前目录下30天之前/30天以内的文件
三、统计
查找文件的命令
在 linux 要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:
which 查看可执行文件的位置
whereis 查看文件的位置
locate 配合数据库查看文件位置
find 实际搜寻硬盘查询文件名称
Shell是一种特殊程序
Linux命令的分类格式及使用方法
Linux常用命令
- 查看及切换目录(pwd、cd、ls、du)
- 创建目录和文件(mkdir、touch、In)
- 复制、删除、移动目录和文件(cp、rm、mv)
- 查找目录和文件(which、find)