---
sidebar: auto
---

# Lab-1 熟悉类Linux系统的命令

## 本章导读

本章意在介绍Linux系统的常用命令，要求掌握Linux一般命令格式，学会使用man命令来寻求帮助，学习使用命令对有关文件和目录进行操作，利用vi编辑器建立、编辑、显示及加工处理文本文件。

## 帮助命令

### `man`命令：显示联机帮助手册

Linux的命令有很多参数，我们不可能全记住，我们可以通过man命令查看联机手册获取帮助。
格式：man 命令

```shell
# 显示出ls命令的功能及选项的含义
man ls
```

### `help`命令：显示帮助信息

同时，也可以使用`help`命令查看帮助信息.

```shell
# 显示出ls命令的功能及选项的含义
help ls
```

## 简单命令

### `date`命令：显示时间

显示或设置系统的日期或时间

### `cal`命令：显示日历

显示公元1-9999年中任意一年或任意一个月的日历

### `who`命令：显示用户信息

列出所有正在使用系统的用户、所有终端名和注册到系统的时间

### `clear`命令：清除信息

清除屏幕上的信息

## 文件与目录的操作

对文件可以进行的操作有：复制一个文件、显示文件内容、查找指定内容、排序、文件比较、文件删除等

### `pwd`命令：显示绝对路径

>**基本语法**

```shell
# 查看当前路径
pwd
```

### `ls`命令：显示所有的文件和目录

如果未指定目录则默认显示当前目录先的所有文件和目录

>基本语法：*ls 目录或文件*

```shell
# 查看当前路径下所有文件或目录
ls
# 查看当前路径下所有文件或目录的详细信息
ls -l
# 查看当前路径下的隐藏文件
ls -ai
```

### `cd`命令：切换目录

>基本语法：*cd 目录*

```shell
# 切换到 /home 目录下
cd /a
# 切换到用户主目录
cd ~
# 切换到上一次访问的目录
cd -
# 切换到当前目录的上一级
cd ..
```

### `mkdir`命令：创建目录

>基本语法：*mkdir 目录名*

```shell
# 创建一个 dir 目录(一级)
mkdir dir1
# 创建 dir1 目录，其下再创建 dir2 目录(多级)
# -p 选项用于创建多级目录
mkdir -p dir1/dir2
```

### `rmdir`命令：删除目录(空目录)

>基本语法：*rmdir 目录名*

```shell
# 删除 home 下的dir目录
rmdir /home/dir
```

>>mdir 删除的是空目录，目录下有内容时是无法删除的，-rf 则可删除非空目录

```shell
# 强制删除 home 下的 dir 目录
rmdir -rf /home/dir
```

### `touch`命令：创建空文件

>基本语法：*touch 文件名*

```shell
# 创建 hello.txt 空文件
touch hello.txt
```

### `cp`命令：拷贝文件或目录

>基本语法：*cp 源文件 目标文件*

```shell
# 拷贝 hello.txt 文件到 /tmp/files 目录中
cp file.txt /tmp/files
# 递归将 home 下的整个 dir1 目录拷贝到 dir2 目录下
cp -r /home/dir1 /dir2/
# 如果连续执行相同的拷贝命令系统会一个一个提示是否覆盖文件内的文件
# 这时在 cp 前加一个 \ 就可以进行强制覆盖，不提示
\cp -r /home/dir1 /dir2/ 
```

### `rm`命令：删除文件或目录

>基本语法：*rm 文件或目录*

```shell
# 删除指定的文件 file1.txt
rm file.txt
# 删除当前目录下的所有文件
rm *
# -r 递归删除 dir1 目录下的所有文件及子目录
rm –r dir1
# -f 强制删除文件，不提示
rm –f file.txt
```

### `mv`命令：移动或重命名

>基本语法：*mv 旧文件名 新文件名、mv /源目录 /目标目录*

```shell
# 将 file.txt 文件移到上层目录
mv file.txt ..
# 将 file1.txt 改名成 file2.txt
mv file1.txt file2.txt
```

>>重命名的前提是两个文件在同一个目录下

### `more`命令：文本过滤器

>基本语法：*more 要查看的文件*

```shell
# 查看 file.txt 文件的内容
more file.txt
```

>>more 指令是一个基于 vim 编辑器的文本过滤器(在后面我们我谈到vim编辑器)
>>
>>可以以全屏幕的方式按页显示文本文件的内容，且有若干快捷键：
>>
>>`space`向下翻一页
>>
>>`Enter`向下翻一行
>>
>>`q`立即离开more，不再显示文件内容
>>
>>`Ctrl+F`向下滚动以一屏
>>
>>`Ctrl+B`返回上一屏
>>
>>`=`输出当前行的行号
>>
>>`:f`输出文件名和当前行的行号


### `cat`命令：查看文件内容或连接文件

>基本语法：*cat 文件*

### `> / >>`命令：输出重定向/追加

>重定向 > 会覆盖之前内容，追加 >> 会将新内容添加到之前内容的末尾

```shell
# 和 more 命令搭配使用,逐页显示
cat file.txt more
# 将 file2.txt 附加到 file1.txt 文件之后
cat file2.txt >> file1.txt
# 将 file1.txt 和 file2.txt 合并成 file3.txt 文件
cat file1.txt file2.txt > file3.txt
```

### `echo`命令：输出内容到控制台

>基本语法：*echo 输出内容*

```shell
# 输出环境变量 $PATH
echo $PATH
# 输出语句“Hello World”
echo "Hello World"
```

### `head`命令：显示文件开头部分

>基本语法：*head 文件*
>>默认情况下 head 显示文件的前十行

```shell
# 查看 file.txt 文件的前 10 行内容
head file.txt
# 查看 file.txt 文件的前 5 行内容
head -n 5 file.txt
```

### `tail`命令：显示文件尾部的部分

>基本语法：*tail 文件*
>>默认情况下 tail 显示文件的后十行

```shell
# 查看 file.txt 文件的后 10 行内容
tail file.txt
# 查看 file.txt 文件的后 5 行内容
tail -n 5 file.txt
# 查看 file.txt 文件的后 10 行内容，并实时追踪文件更新
tail -f file.txt 
```

### `ln命令`：在文件间建立链接

>基本语法：*ln [选项] 源文件 目录文件或目录*
>>选项说明：
>>
>>`-b`为删除的文件建立备份
>>
>>`-d`允许root用户建立硬链接
>>
>>`-F`与b相同
>>
>>`-f`强行删除目标文件
>>
>>`-i`在删除文件时给出提示
>>
>>`-n`当目标文件是目录的符号链接时，替代该符号链接
>>
>>`-s`用符号链接代替硬链接(建立符号链接)
>>
>>`-v`输出被链接文件的文件名
>>
>>>软链接也称符号链接，类似 Windows 中的快捷方式
>>>
>>>主要存放了链接其他文件的路径，删除软连接的方式与删除文件相同

```shell
# 创建一个软连接 myroot，连接到 /root 目录
ln -s /root /myroot
# 删除软连接 myroot
rm /myroot
```

### `chmod`命令：修改文件权限

>基本语法：*chmod [选项] 文件或目录名*
>>选项说明：
>>
>>`u` 文件所有者
>>
>>`g` 文件所属组
>>
>>`o` 其它用户
>>
>>`a` 所有用户
>>
>>`+` 增加权限
>>
>>`-` 取消权限
>>
>>`=` 赋给权限
>>
>>`r` 读权限
>>
>>`w` 写权限
>>
>>`x` 执行权限

```shell
# 将 file1.txt 文件设为所有人皆可读写
chmod a+rw file1
# 将 file.py 设定为只有该档案拥有者可以执行
chmod u+x file.py 
```

### `gcc`命令：编译

>基本语法：*gcc [选项] 文件名*
>>常用选项:
>>
>>`-v` 查看gcc编译器的版本，显示gcc执行时的详细过程
>>
>>`-o` 指定输出文件名为file，这个名称不能跟源文件名同名
>>
>>`-E` 只预处理，不会编译、汇编、链接
>>
>>`-S` 只编译，不会汇编、链接
>>
>>`-c` 编译和汇编，不会链接

```shell
# 编译 hello.c 并指定输出文件为 hello
gcc hello.c -o hello
```

## 搜索查找类命令

### `find`命令：查找文件

>基本语法：*find 范围 方式 文件*

```shell
# 根据文件名查找 home 下的 file.txt 文件
find /home -name file.txt
# 根据用户查找 home 下用户昵称为 DrangonOS 的文件
find /home -user DrangonOS
# 根据文件大小查找系统中大小为 200M 的文件
find / -size 200M
```

### `locate`命令：定位文件路径

>基本语法：*locate 文件*
>>locate 指令可以快速定位文件路径，利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位文件，无需遍历整个文件系统
>>
>>但为了保证查询准确度，管理员须定期更新locate时刻

```shell
# 创建 locate 数据库，第一次使用 locate指令前必须先创建数据库
updatedb
# 定位 file.txt 文件的路径
locate file.txt
```

### `which`命令：定位指令路径

>基本语法：*which 指令*

```shell
# 检索 cp 指令所在路径
which cp
# 输出
alias cp='cp -i'
    /usr/bin/cp
```

### `grep`命令：过滤查找（搜索字符串）

>基本语法：*grep 查找内容 源文件*
>>grep 命令可以搜索特定字符串来并显示出来，一般用来过滤先前得结果，避免显示太多不必要得信息

```shell
# 查找 hello.txt 文件中 “yes” 所在行
grep "yes" hello.txt
# 查找 hello.txt 文件中 “yes” 所在行
cat hello.txt | grep "yes"
#  查找 hello.txt 文件中 “yes” 所在行并显示行号
cat hello.txt | grep -n "yes"
```

>>>`|`管道命令：将某命令的结果输出给另一命令

## 压缩解压类命令

### `tar`命令：打包文件

>基本语法：*tar [选项] 内容*
>>选项说明：
>>
>>`-c`创建一个新的tar文件
>>
>>`-v`显示运作过程信息
>>
>>`-f`指定文件名称
>>
>>`-z`调用gzip压缩命令执行压缩；
>>
>>`-j`调用bzip2压缩命令执行压缩
>>
>>`-t`查看压缩文件内容
>>
>>`-x`解开tar文件

```shell
# 将 file.tar.gz 解压到当前目录
tar -zxvf a.tar.gz
# 将 /home 下的文件夹压缩为 file.tar.gz
tar -zcvf file.tar.gz /home/
# 将 file.tar.gz 解压到 /tmp 目录下
tar -zxvf file.tar.gz -c /tmp
```

>>>tar 打包后的文件为 .tar.gz 文件

### `gzip`命令：压缩和解压缩文件

>基本语法：*gzip [选项] 文件*
>>选项说明：
>>
>>`-c`将输出写到标准输出上，并保留原有文件。
>>
>>`-d`将压缩文件解压。
>>
>>`-l`对每个压缩文件，显示下列字段：压缩文件的大小、未压缩文件的大小、压缩比、未压缩文件的名字
>>
>>`-r`递归式地查找指定目录并压缩其中的所有文件或者是解压缩。
>>
>>`-t`测试，检查压缩文件是否完整。
>>
>>`-v`对每一个压缩和解压的文件，显示文件名和压缩比。
>>
>>`-num`用指定的数字num调整压缩的速度，-1或--fast表示最快压缩方法（低压缩比），-9或--best表示最慢压缩方法（高压缩比），系统缺省值为6

```shell
# 将usr.tar压缩为usr.tar.gz文件
gzip usr.tar
# file1.txt压缩为file1.txt.gz文件
gzip file1.txt
# 将压缩文件usr.tar解压，并列出详细的信息
gzip –dv usr.tar.gz
```

### `unzip`命令：压缩和解压缩文件(zip拓展)

>基本语法：*unzip [选项] 文件名.zip*
>>选项说明：
>>
>>`-x`文件列表 解压缩文件，但不包括指定的file文件。
>>
>>`-v`查看压缩文件目录，但不解压。
>>
>>`-t`测试文件有无损坏，但不解压。
>>
>>`-d`目录 把压缩文件解到指定目录下。
>>
>>`-z`只显示压缩文件的注解。
>>
>>`-n`不覆盖已经存在的文件。
>>
>>`-o`覆盖已存在的文件且不要求用户确认。
>>
>>`-j`不重建文档的目录结构，把所有文件解压到同一目录下

```shell
# 将压缩文件text.zip在当前目录下解压缩
uzip text.zip
```

## 编辑命令vi

### vi编辑器介绍

vi 编辑器是 Linux 系统下的标准编辑器，vi 可以分为三种状态，分别是命令行模式、插入模式和底行模式，各模式的功能区分如下：

* 命令行模式：控制屏幕光标的移动，字符、字或行的删除，移动复制某区段及进入插入模式下，或者到底行模式
* 插入模式：只有在插入模式下，才可以做文字输入，按 ESC 键可回到命令行模式
* 底行模式：将文件保存或退出 vi ，也可以设置编辑环境，如寻找字符串、列出行号等

在使用时通常把 vi 简化成两个模式，将底行模式也算入命令行模式

### 命令模式（Command mode）

启动 vi ，在系统提示符号输入 vi 及文件名称后，就进入 vi 全屏幕编辑画面，处于命令行模式，可移动光标、删除、移动、复制

>`i`当前光标前插入
>
>`a`当前光标后插入
>
>`o`当前光标所在行下插入空行
>
>`I`当前光标所在行上插入空行
>
>`A`插于行首
>
>`O`插于行尾
>
>`x`删除一个字符
>
>`dd`删除光标所在的行

### 插入模式（Insert mode）

切换到插入模式才能够输入文字，在命令行模式下按下字母 i 进入插入模式，进行字符的输入和文件的编辑

>按`ESC`返回命令模式
>
>按`ESC`后输入“：”，进入底行模式

### 底行模式（Lastline mode）

在命令行模式下，按一下冒号 ：键进入底行模式

>`: w 文件名` 将文件以指定文件名保存
>
>`: wq` 输入wq，存盘并退出vi
>
>`: q!` 输入q!，不存盘强制退出vi
