
文章目录
-
- [1. Linux、远程登录与命令格式](#1. Linux、远程登录与命令格式)
-
- [1.1 Shell 与命令的执行](#1.1 Shell 与命令的执行)
- [1.2 练习目录](#1.2 练习目录)
- [2. 路径与工作目录](#2. 路径与工作目录)
-
- [2.1 当前用户与当前位置](#2.1 当前用户与当前位置)
- [2.2 绝对路径与相对路径](#2.2 绝对路径与相对路径)
- [2.3 目录切换](#2.3 目录切换)
- [3. 文件属性与目录列表](#3. 文件属性与目录列表)
-
- [3.1 文件的内容与属性](#3.1 文件的内容与属性)
- [3.2 `ls -a`、`ls -l` 与 `ls -d`](#3.2
ls -a、ls -l与ls -d) - [3.3 长格式字段与文件类型](#3.3 长格式字段与文件类型)
- [4. 目录创建与文本写入](#4. 目录创建与文本写入)
-
- [4.1 `mkdir` 与 `touch`](#4.1
mkdir与touch) - [4.2 `echo` 与输出重定向](#4.2
echo与输出重定向) - [4.3 `cat` 与固定练习文本](#4.3
cat与固定练习文本)
- [4.1 `mkdir` 与 `touch`](#4.1
- [5. 文件复制、移动与删除](#5. 文件复制、移动与删除)
-
- [5.1 `cp` 与目标路径](#5.1
cp与目标路径) - [5.2 `mv` 的移动与重命名](#5.2
mv的移动与重命名)
- [5.1 `cp` 与目标路径](#5.1
- [6. 文本分页与局部查看](#6. 文本分页与局部查看)
-
- [6.1 `less` 分页阅读](#6.1
less分页阅读) - [6.2 `head` 与 `tail`](#6.2
head与tail) - [6.3 `tail -f` 跟踪追加内容](#6.3
tail -f跟踪追加内容)
- [6.1 `less` 分页阅读](#6.1
- [7. 文件查找、文本筛选与管道](#7. 文件查找、文本筛选与管道)
-
- [7.1 `find` 查找文件](#7.1
find查找文件) - [7.2 `grep` 筛选文本行](#7.2
grep筛选文本行) - [7.3 管道与输出文件](#7.3 管道与输出文件)
- [7.1 `find` 查找文件](#7.1
- [8. 命令帮助与常用补充](#8. 命令帮助与常用补充)
-
- [8.1 `man`、`--help` 与 `help`](#8.1
man、--help与help) - [8.2 时间与系统信息](#8.2 时间与系统信息)
- [8.1 `man`、`--help` 与 `help`](#8.1
1. Linux、远程登录与命令格式
Linux 严格来说是操作系统的内核。平时安装的Centos、Ubuntu、Debian、Rocky Linux 等发行版,则把内核与系统工具、软件管理工具等组合成可以使用的系统。
如果使用云服务器,购买时关注地域、费用、配置和系统镜像即可,基础命令练习通常不需要很高的配置。
在云控制台取得服务器的公网地址与登录用户名,再通过 SSH 登录。Windows 可以使用 PowerShell 中的 ssh,也可以用 Xshell、MobaXterm 等终端软件建立 SSH 会话。
powershell
# 在本地 Windows 中执行;替换用户名和公网地址
ssh 用户名@服务器公网IP
密钥登录需要按云厂商说明指定私钥。首次连接会提示核对主机指纹;密码输入时通常不显示字符,也不显示星号。
登录以后,终端里的 Linux 命令在远端服务器执行。 本地 Windows 的磁盘路径不能直接当成服务器上的路径使用。
1.1 Shell 与命令的执行
终端提供输入和显示界面,Shell 是解释命令的程序,Bash 就是常见的一种 Shell。Shell 解析输入,处理引号、重定向等语法,再执行内建命令或启动外部程序;程序通过操作系统提供的接口完成实际工作。
常见命令格式是:
text
命令名 [选项] [操作对象]
方括号表示该部分可以省略,不需要把方括号输入终端。例如:
bash
ls -l /tmp
这里 ls 是命令,-l 改变显示方式,/tmp 是被查看的目录。命令名、选项、对象之间用空格分开。很多短选项可以进行合并,例如 ls -a -l 可以写为 ls -al。
1.2 练习目录
以下练习都会在当前用户的家目录(个人云服务器)中进行,不需要 root 权限。在创建我们的练习目录前,先确认 linux-command-lab 不是存放已有资料的目录;如有重名,换一个名称,并同步修改后续路径。
下面的 mkdir -p 会创建目录及缺少的上级目录。
bash
mkdir -p ~/linux-command-lab/logs ~/linux-command-lab/backup
cd ~/linux-command-lab
2. 路径与工作目录
2.1 当前用户与当前位置
在命令行输入whoami 显示当前有效用户的用户名,pwd 显示当前工作目录。前者回答当前登录的身份,后者回答位置,两个问题互不替代。
bash
whoami
pwd
例如当前我作为普通用户可能看到:

工作目录不是"目前打开的整个服务器",而是解析相对路径时所依据的目录。
2.2 绝对路径与相对路径
Linux 把文件和目录组织在以 / 为根的目录结构中,不采用 Windows 的 C:、D: 盘符形式。此处可以先把它理解成一棵目录树:
text
/ 根目录
├── home/
│ └── by2099/ 示例用户的家目录
│ └── linux-command-lab/
│ ├── logs/
│ └── backup/
└── tmp/
目录用来组织名称;普通文件则保存具体内容。在后面的学习中我们会认识到,同一个文件可以通过不同路径访问,所以"能用路径定位文件"不等于"每个文件只有一条路径"。
| 写法 | 含义 | 示例 |
|---|---|---|
/ |
单独使用表示根目录;路径中也作分隔符 | /tmp |
. |
当前目录 | ./logs |
.. |
上级目录 | ../backup |
~ |
由 Shell 展开为当前用户的家目录 | ~/linux-command-lab |
以 / 开头的路径 |
绝对路径,从根目录开始定位 | /home/by2099/linux-command-lab/logs |
不以 / 开头的普通路径 |
相对路径,依赖当前工作目录 | logs、../backup |
注意不要把
.和..记反:一个点是当前目录,两个点是上级目录。~则是 Shell 的便捷写法,展开后才成为实际路径。

2.3 目录切换
cd 改变当前 Shell 的工作目录。下面按顺序执行,观察每次 pwd 的结果:
bash
cd logs
pwd
cd ../backup
pwd
cd ..
pwd

返回路径依次以 /linux-command-lab/logs、/linux-command-lab/backup、/linux-command-lab 结尾。第二条 cd 中,先由 .. 返回练习目录,再进入其中的 backup,并不是寻找 logs 内部的 backup。
另外有三种很常用的写法:
bash
cd ~ # 进入家目录;单独输入 cd 也可以
cd / # 进入根目录
cd - # 回到上一次工作目录,通常也会显示切换后的路径
Linux 文件名通常区分大小写,比如notes.txt 和 Notes.txt 是不同的名称。含空格的路径需要用引号整体包住,例如 cd "study notes";
3. 文件属性与目录列表
3.1 文件的内容与属性
在当前学习中,我们可以把文件概括为两个方面 "内容+属性":
- 内容是保存的数据;
- 属性描述类型、大小、所有者、权限和时间等信息。
cat 等命令关注文件内容,ls -l 主要显示属性。一个空文件虽然没有正文,但仍然有名称、类型、所有者、时间等信息。
ls 不带对象时列出的是当前目录中的可见条目;指定目录时默认列出其中的条目;指定普通文件时显示该文件本身。
3.2 ls -a、ls -l 与 ls -d
| 选项 | 作用 | 适用情况 |
|---|---|---|
-a |
包括以 . 开头的隐藏名称,也包括 . 和 .. |
查看隐藏文件 |
-l |
使用长格式显示详细信息 | 查看类型、大小、所有者等 |
-d |
显示目录条目本身,不展开目录内容 | 查看目录自身的属性 |
bash
ls
ls -a
ls -l
ls -ld logs
ls -ald .

ls -ald . 就是组合使用 -a、-l、-d,查看当前目录下的长格式信息。其中,查看普通名称目录自身属性的关键是 -ld;-a 负责显示隐藏名称。
比较 ls -l logs 和 ls -ld logs:前者列出 logs 内的条目,此时目录为空,通常只看到 total 0;后者显示 logs 目录本身那一行。这是 -d 最容易混淆的地方。

3.3 长格式字段与文件类型
下面就是是一行典型的长格式输出,具体用户名和时间以自己的环境为准:


| 字段 | 当前需要理解的含义 |
|---|---|
第一个字符 - |
文件类型,这里是普通文件 |
后面九个字符 rw-rw-r-- |
三组访问权限 |
1 |
硬链接数,当前先认识字段名称,不展开链接机制 |
两个 by2099 |
所有者、所属组 |
30 |
对这个普通文件而言,是文件长度,单位为字节 |
| 日期和时间 | 默认主要反映最后修改时间,显示形式可能不同 |
notes.txt |
文件名 |
常见的文件类型标识如下,先重点记住前三种:
| 首字符 | 类型 |
|---|---|
- |
普通文件 |
d |
目录 |
l |
符号链接 |
c、b |
字符设备、块设备 |
p、s |
FIFO 管道、套接字 |
普通文件内部还可能是文本、图片、可执行程序等。由于Linux 不单靠扩展名决定文件类型 ,所以给文本文件加上 .png 后缀并不会把它变成图片。
4. 目录创建与文本写入
4.1 mkdir 与 touch
mkdir 用来创建目录,使用mkdir -p a/b 命令会在需要时补齐上级目录。
当指定目录已经存在时,
-p通常也不会因这一点报错,也不会替你清空已有目录。
touch 在目标不存在时通常创建空文件;若目标已经存在时,默认更新时间戳,不会清空或重写已有内容。
bash
mkdir drafts
mkdir -p work/day1
touch notes.txt
touch .practice
ls -a

tree:以树形结构打印当前目录下所有文件和文件夹 ,一眼看懂目录层级关系。默认系统没有自带 tree,需要先安装(下面为安装命令,此时直接复制执行即可):
sudo yum install tree -y(普通用户)yum install tree -y(root用户)
.practice以点开头,因此默认的ls不显示它,ls -a可以显示。而所谓的隐藏首先是一种命名约定,不代表文件得到加密或访问保护。
4.2 echo 与输出重定向
echo 可以把参数输出出来,默认在末尾加一个换行。例如 echo 'hello Linux' 通常只在终端显示文字,不会自动保存成文件。
需要写入文件,可使用 Shell 的输出重定向:
bash
echo 'Linux practice' > notes.txt
echo 'paths and files' >> notes.txt
cat notes.txt
输出为:

| 写法 | 结果 |
|---|---|
命令 > 文件 |
将标准输出写入文件;文件不存在则创建,存在时通常先清空再写入 |
命令 >> 文件 |
将标准输出追加到文件末尾;文件不存在则创建 |
> 和 >> 是 Shell 语法,不是 echo 的选项。
"标准输出"可以先理解为程序正常输出数据的通道,默认通常连到终端。
特别注意,Shell 一般在命令真正读取文件前就处理重定向。 因此,不能用
cat notes.txt > notes.txt来进行"原样写回",输入文件可能先被清空。需要处理原文件时,先输出到不同的文件名,再检查结果。
4.3 cat 与固定练习文本
cat 文件 可以查看内容,多个文件则按参数顺序连续输出。适合短文本,不适合不加区分地查看图片、压缩包等二进制内容。
先建立一份六行的模拟日志:
bash
echo 'INFO service start' > logs/sample.log
echo 'INFO user login' >> logs/sample.log
echo 'ERROR disk full' >> logs/sample.log
echo 'warning retry' >> logs/sample.log
echo 'error timeout' >> logs/sample.log
echo 'INFO service stop' >> logs/sample.log
cat logs/sample.log
输出为:

扩展选项:
cat -n logs/sample.log给所有输出行编号,方便对照位置。编号只加在显示结果中,不会修改原文件。cat -b只给非空行编号。cat -s将连续的多个空行压缩显示为一个空行。
5. 文件复制、移动与删除
5.1 cp 与目标路径
cp 源 目标 用于复制文件。常见用法如下:
bash
cp notes.txt notes-copy.txt
cp notes.txt backup/
cp -r logs logs-copy
- 第一条创建不同名称的副本;
- 第二条把副本放到已存在的
backup目录中,名称仍为notes.txt; - 第三条递归复制目录。这里
logs-copy原先不存在,执行后得到logs-copy/sample.log。

目标是否已经存在,会影响结果。 上述情况如果 logs-copy 已经是一个目录,再执行 cp -r logs logs-copy时,通常会把 logs 放进它里面,形成 logs-copy/logs/...。
复制普通文件时,如果目标文件已经存在,默认可能覆盖它。如果希望覆盖前询问用户是否确认执行,可以使用 cp -i 源 目标。
5.2 mv 的移动与重命名
mv 源 目标 用来移动文件或目录,同时也用于重命名:
bash
mv notes-copy.txt notes-renamed.txt
mv notes-renamed.txt backup/
ls backup
此时输出为:

第一条修改名称,第二条改变所在目录;移动后,原位置不再保留那个副本。
移动整个目录不需要像
cp那样添加-r。

也可以同时改变文件的位置与名称,例如
mv old.txt backup/new.txt。但目标文件已存在时也可能发生覆盖;需要询问确认时使用mv -i。
6. 文本分页与局部查看
6.1 less 分页阅读
当一个文件比较长时,cat 会把内容直接全部输出,容易刷过需要的位置。less logs/sample.log 则进入分页阅读界面。
| 按键 | 常见作用 |
|---|---|
| 空格、PageDown | 向后翻页 |
PageUp、b |
向前翻页 |
/ERROR 后按 Enter |
向后搜索 ERROR |
n、N |
重复上次搜索、反方向重复搜索 |
g、G |
到文件开头、末尾 |
q |
退出分页界面 |
需要指定行号时使用 less -N logs/sample.log,这里是大写 N。
6.2 head 与 tail
只想看文件的开头或结尾时,用 head 和 tail,默认通常显示十行,-n 可指定行数:
bash
head -n 3 logs/sample.log
tail -n 2 logs/sample.log
第一条输出:

第二条输出:

6.3 tail -f 跟踪追加内容
tail -f 先显示末尾内容,再继续等待新追加的数据:
bash
# 服务器终端 A
cd ~/linux-command-lab
tail -f logs/sample.log
再开一个登录到同一台服务器、同一用户的终端:
bash
# 服务器终端 B
cd ~/linux-command-lab
echo 'INFO new connection' >> logs/sample.log
终端 A 随后显示新行。按 Ctrl+C 结束跟踪,回到命令提示符。


7. 文件查找、文本筛选与管道
7.1 find 查找文件
知道文件的名称、但不知道文件在哪时,可以使用 find 起点 条件。它遍历指定目录范围,输出符合条件的路径:
bash
find . -name 'notes.txt'
find . -type f -name '*.log'
输出:

第一条找到两条路径,输出先后顺序不作保证。
第二条查找后缀为.log的普通文件,-type f 是类型条件,-name 后是名称模式,不是搜索文件正文(*号是通配符)。
7.2 grep 筛选文本行
find 查找路径,grep 按模式筛选文本行。它通常输出整条匹配行,而不只是命中的几个字符。
bash
grep 'ERROR' logs/sample.log
grep -ni 'error' logs/sample.log
grep -nvi 'error' logs/sample.log

第一条区分大小写,只输出:
text
ERROR disk full
第二条带行号、忽略大小写:
text
3:ERROR disk full
5:error timeout
第三条是在同样忽略大小写的前提下,输出不匹配的行:
text
1:INFO service start
2:INFO user login
4:warning retry
6:INFO service stop
| 选项 | 作用 |
|---|---|
-n |
显示输入中的行号 |
-i |
忽略大小写差异 |
-v |
反向选择不匹配的行 |
7.3 管道与输出文件
管道符 | 可以把左边命令的标准输出连接到右边命令的标准输入。标准输入可以理解为程序接收数据的通道;前面没有给 head、tail 直接指定文件时,也可以由这个通道提供数据。
例如查看日志的第 2~4 行:
bash
head -n 4 logs/sample.log | tail -n 3
结果为:

左边先取前四行,右边再从这四行里取最后三行。因此,tail 接收到的是文本数据,不是字符串 logs/sample.log,也不是左边命令的文件名参数。
筛选结果还可以继续保存:
bash
grep -i 'error' logs/sample.log > errors.txt
cat errors.txt
输出为:


8. 命令帮助与常用补充
8.1 man、--help 与 help
刚开始学习时可以不必要把全部选项背下来,但是要能找到本机工具的说明:
bash
man ls
ls --help
help cd
man查找本机手册,分页器常支持/关键词搜索、n继续查找、q退出。--help常用于 GNU 工具的简要帮助,并非所有命令都支持。
8.2 时间与系统信息
以下用法偶尔需要时再查,不扩展成另一套选项目录:
| 命令 | 用途与边界 |
|---|---|
date |
查看服务器当前时间,时区以服务器设置为准 |
date '+%Y-%m-%d %H:%M:%S' |
格式化显示时间;大写 %M 是分钟,小写 %m 是月份 |
date +%s |
查看 Unix 时间戳,即从 UTC 的 1970-01-01 00:00:00 起计的秒数,不计闰秒 |
uname -r |
查看内核版本,不是发行版版本 |
cat /etc/os-release |
在提供该文件的发行版上查看发行版标识 |
cal |
查看日历 |
bc |
命令行计算器,可能需要另装软件;交互时输入 quit 退出 |
终端里的 Ctrl+C 通常用于中断当前前台任务;Ctrl+D 常用于在当前输入为空时表示输入结束,在 Shell 提示符处也可能退出会话,所以不能把它们都当作是 Windows 的复制或粘贴快捷键,复制、粘贴快捷键取决于使用的终端软件。
至此,日常文件操作已经能连起来:用路径确定对象,用 ls 观察属性,用 cp/mv/rm 整理文件,再用 less/head/tail/grep 读取需要的信息。
