Linux 基础与常用命令
本文合并自:01-Linux基础.md、01-Linux基础命令.md、1-1-Linux基础与命令行使用手册.md、04-Linux常用命令与工具.md
适用系统:CentOS 6 / CentOS 7 / RHEL 6-7 系列(版本差异处已单独标注) 核心场景:Linux 日常操作、终端使用、目录与文件管理、文件内容查看、重定向与管道、系统信息查询
本章要点
- 认识 Linux 控制台与终端,掌握打开终端、解读命令提示符、中文 locale 设置、字体/颜色/透明度配置、关机重启等基本操作。
- 理解 Shell 命令的格式、参数(长选项/短选项、选项值)以及内部命令与外部命令的区别。
- 熟练使用
man、info、--help查阅帮助。 - 熟悉 Linux 根文件系统(FHS)下各级目录的作用。
- 掌握目录命令
pwd、cd、mkdir、rmdir,文件命令ls、stat、ln、touch、cp、mv、rename、rm。 - 掌握文件阅读命令
cat、head、tail、less、more。 - 理解标准输入/输出/错误输出,掌握
>、>>、2>、&>、<、<<、<<<重定向以及|管道。 - 掌握通配符、大括号展开、引号规则与批量操作技巧,会用
alias/unalias/which管理命令别名。 - 掌握系统信息与常用工具:
uname、hostname、date、cal、uptime、who、w、id、df、du、free、echo、seq、wc、sort、uniq、cut、tr、diff、clear、bc、read。 - 掌握
tmux(以及早期的screen)的会话、窗口、窗格管理与复制粘贴。 - 了解
/dev/null、/dev/zero、/dev/urandom等常用设备文件。 - 学会通过 NFS 简单挂载远程共享目录,便于获取课堂素材。
一、Linux 与终端环境简介
1.1 为什么 Linux 运维围绕命令行
Linux 主要通过命令行进行操作。在 Linux 中,无论是 CPU、内存、磁盘、键盘、鼠标还是用户,几乎所有资源都以文件形式呈现,因此 Linux 的运维本质上是围绕“文件”进行的:查看文件、修改文件、复制移动删除文件、给文件设置权限。
控制台(终端)是以后学习和工作的主要工具,负责接收用户输入的命令并把执行结果反馈给用户。Linux 下的所有操作几乎都可以在终端中通过命令完成。
用户输入的命令由 Shell(命令解析器) 负责解释执行,CentOS 6/7 默认 Shell 均为 Bash:
echo $SHELL
/bin/bash
1.2 打开终端
| 方式 | 操作 |
|---|---|
| 鼠标方式 | 在桌面空白处右键,选择“打开终端”/“在终端中打开” |
| 快捷键方式 | 可自定义设置,如 Ctrl + Alt + T |
| 纯文本模式 | 系统未安装图形界面时,登录后直接进入命令行 |
GNOME 默认没有直接打开终端的快捷键,需要手动设置:
- 点击屏幕左上角“活动”或右上角菜单,进入 Settings(设置)。
- 进入最下方的 Devices(设备) → Keyboard(键盘)。
- 拉到最右侧最下方,点击 + 号添加自定义快捷键:
- Name:
Open Terminal - Command:
/bin/gnome-terminal - Shortcut:按下
Ctrl + Alt + T
- Name:
1.3 登录后的命令提示符
[root@qianyun ~]#
| 组成部分 | 含义 |
|---|---|
root |
当前登录用户 |
qianyun |
主机名 |
~ |
当前所在目录(~ 代表当前用户的家目录) |
# |
当前为 root 用户(普通用户显示为 $) |
家目录说明:每个用户都有自己的家目录。root 的家目录是 /root,普通用户的家目录是 /home/用户名。除 root 外,普通用户默认只能进入自己的家目录,除非有权限授权。
用户、组、权限的完整管理(
useradd、passwd、chmod、chown等)详见 阶段02 用户与权限管理。
1.4 把语言环境设置为中文
查看当前语言环境:
locale
LANG=en_US.UTF-8 # 当前为英文环境
查看系统已安装/支持的语言环境(字符集):
sudo locale -a # 列出全部字符集
sudo locale -a | grep zh_CN # 过滤出中文字符集
确认其中是否包含 zh_CN.utf8(简体中文)。如果没有,先安装中文语言包:
sudo yum install kde-l10n-Chinese -y
编辑语言环境配置文件:
-
CentOS 7:配置文件为
/etc/locale.confsudo vim /etc/locale.conf# 注释掉原来的英文配置 #LANG="en_US.UTF-8" LANG="zh_CN.UTF-8" -
CentOS 6:配置文件为
/etc/sysconfig/i18n,写法同样是LANG="zh_CN.UTF-8"。
重启系统使配置生效:
reboot
重启后若提示“是否更新目录名称为中文”,建议选择“以后不再提示”并保留原来的英文目录名,以避免命令行下中文路径带来的麻烦。
1.5 终端基础使用
| 操作 | 快捷键/命令 |
|---|---|
| 放大字体 | Ctrl + Shift + = |
| 缩小字体 | Ctrl + - |
| 新建终端窗口 | Ctrl + Shift + N |
| 在终端内新建标签 | Ctrl + Shift + T |
| 在标签之间切换 | Alt + 1 ~ Alt + 9 |
| 清屏 | clear 或 Ctrl + L |
| 关闭终端 | exit |
1.6 终端外观配置
在终端中选择 右键 → 配置文件 → 配置文件首选项,可以设置字体、字号、颜色和透明度:
- 字体推荐:
DejaVu Sans Mono Bold,字号 14。 - 颜色建议取消“使用系统主题中的颜色”,选择黑底白字。
- 透明度不建议调得过大,以不影响阅读为准。
1.7 关机和重启
reboot # 重启
init 6 # 重启(切换运行级别 6)
init 0 # 关机(切换运行级别 0)
init N切换运行级别的方式在 CentOS 6 与 CentOS 7 上都可用;CentOS 7 已改用 systemd,推荐使用systemctl reboot/systemctl poweroff,运行级别对应 target。系统启动流程与运行级别详见 阶段05 内核编译与系统启动过程。
1.8 修改命令提示符 PS1
编辑当前用户的 Bash 配置文件:
vim ~/.bashrc
在文件末尾添加:
export PS1='\[\033[01;31m\]root@\[\033[01;33m\]$HOSTNAME\[\033[01;35m\] \w\n\[\033[00m\]$ '
让配置立即生效:
source ~/.bashrc
# 或者
. ~/.bashrc
该 PS1 配置将 root 显示为红色、主机名显示为黄色、当前路径显示为紫色,并在新行输出 $ 提示符。
二、命令行基础
Linux 命令严格区分大小写。
2.1 命令是什么
Linux 命令是对 Linux 系统进行管理的指令。执行命令时,Shell 负责解析命令名、查找对应程序、传递参数并输出结果。
2.2 命令格式
命令名 参数1 参数2 ... 参数n
更常见的写法:
命令名 [选项] [参数]
| 元素 | 说明 |
|---|---|
| 命令名 | 要执行的命令,如 ls、cp |
| 选项 | 以 - 或 -- 开头,用于“修正命令的输出方式”/控制命令行为 |
| 参数 | 多为路径或目标对象,是命令处理的对象 |
书写规则:
- 所有英文必须使用半角字符(全角字符光标会占两个位置)。
- 命令名与选项、选项与参数之间必须有一个以上空格分隔,连续的多个空格会被自动当作一个分隔符处理。
- 如果参数中包含空格,需要使用单引号或双引号括起来,例如
touch "my file.txt"。
在 man 手册中常见的语法符号:
| 符号 | 含义 |
|---|---|
[] |
其中的内容可有可无 |
... |
前面的内容可以有多个(不限个数) |
| |
多选一 |
{} |
分组 |
例如 man mv、man ip 中可以看到这些符号的具体使用。
2.3 命令的参数与选项分类
- 选项:以
-或--开头,用于控制命令的行为。- 长选项:以
--开头,后跟单词,可读性高,如--help、--list。 - 短选项:以
-开头,后跟单个字符,便捷性高;多个短选项可以合并,如-l -a可以写成-la。 - 选项值:
- 无值选项(单独表示开关):
-l/--list - 有值选项:
-t utf8/--to=utf8 - 可选值选项:
--color=auto/--color
- 无值选项(单独表示开关):
- 长选项:以
- 普通参数:多为路径或文件名,是命令处理的对象。
| 类型 | 示例 | 说明 |
|---|---|---|
| 短选项 | -l、-a |
单个字符,可组合使用 |
| 长选项 | --help、--list |
可读性强 |
| 无值选项 | -l |
单独表示开关 |
| 有值选项 | -t utf8 |
需要附带参数值 |
2.4 内部命令与外部命令
| 类型 | 说明 |
|---|---|
| 内部命令 | 由 Shell 内部代码实现(Shell 内置),如 cd、type、echo |
| 外部命令 | Shell 之外的独立可执行文件,如 mount、ls |
使用 type 命令可以判断一个命令属于哪一类:
type cd
# cd is a shell builtin <- 内部命令
type mount
# mount is /usr/bin/mount <- 外部命令,并显示其位置(CentOS 6 为 /bin/mount)
使用 man type 可以查看 Bash 自带的内部命令清单。
2.5 帮助命令
man(最常用)
man 注重于命令的使用方法,是最常用的帮助方式:
man ls
man mv
man 5 passwd # 查看配置文件格式说明
手册文件位于 /usr/share/man,并按类别分为 9 节:
| 节号 | 内容 |
|---|---|
| 1 | 普通用户命令 |
| 2 | 系统核心调用的函数工具(系统调用) |
| 3 | 常用函数与函数库 |
| 4 | 设备文件说明 |
| 5 | 配置文件及其他格式文件 |
| 6 | 游戏相关 |
| 7 | 网络协议相关 |
| 8 | 管理员可操作的命令 |
| 9 | 系统内核相关文件 |
可以指定节号查阅,例如 man 1 ls 查看第 1 节中的 ls。
在 man 中常用操作:
| 按键 | 功能 |
|---|---|
/关键字 |
向后搜索关键字 |
n |
跳到下一个匹配 |
N |
跳到上一个匹配 |
空格 |
向下翻一页 |
q |
退出 man |
info
info 注重于对软件/概念的介绍,使用相对较少,文档位于 /usr/share/info:
info # 进入 info 目录页
info ls # 直接查看 ls 的 info 文档
在 info 界面中:
| 按键 | 功能 |
|---|---|
? |
查看 info 自身帮助 |
空格键 |
向下翻一页 |
Tab |
在节点(以 * 标记)之间移动,回车进入节点 |
b |
移动到当前文章第一个节点 |
e |
移动到当前文章最后一个节点 |
n |
前往下一个 info 页 |
p |
前往上一个 info 页 |
u |
向上移动一层 |
s 或 / |
在 info 中搜索 |
h |
显示帮助菜单 |
q |
退出 |
--help
Shell 内置命令可用 help 命令名 查看,绝大多数外部命令支持 --help 输出简要用法:
ls --help
ll --help
help cd # 查看 Bash 内置命令 cd 的帮助
说明:
man对内部命令与外部命令都可查阅(内部命令会跳转到bash手册的相应段落),而--help主要由外部命令自身实现,输出更精简,适合快速回忆选项。
三、Linux 文件系统目录结构(FHS)
Linux 文件系统呈树状结构,根目录 / 是顶级目录,所有目录、文件、设备都挂在这棵树上。CentOS 6 默认文件系统为 EXT4,CentOS 7 默认为 XFS(EXT4 仍然完全支持)。
可以这样理解:根目录相当于整套房子,家目录相当于自己的房间,子目录相当于房间里的衣柜,cd 就是开门进入某个房间。
| 目录 | 作用 |
|---|---|
/ |
根目录,系统所有目录的起点 |
/bin |
系统可执行的二进制文件,即普通用户可用的常用命令 |
/sbin |
管理员可执行的二进制文件(管理员命令) |
/home |
普通用户的家目录 |
/root |
超级管理员 root 的家目录 |
/boot |
系统启动引导目录(内核、引导程序) |
/etc |
系统配置文件 |
/dev |
设备文件 |
/var |
运行过程中经常变化的数据,如日志、邮件、缓存 |
/lib、/lib64 |
系统使用的函数库 |
/usr |
用户安装的软件及其各种目录 |
/tmp |
临时目录,存放程序执行产生的临时文件 |
/lost+found |
分区出现问题时存放遗失片段,仅存在于独立分区(EXT 系文件系统) |
/proc |
虚拟目录,实时记录当前系统状态(内存中,不占磁盘) |
/opt |
扩展软件包存放位置 |
/sys |
Linux 设备模型文件夹,统一表示和操作设备 |
/run |
运行时数据目录,CentOS 7 自动挂载(CentOS 6 中对应 /var/run) |
/media |
默认用于挂载光盘、U 盘等可移动介质 |
/mnt |
默认用于临时/手动挂载 |
/misc |
默认用于 autofs 自动挂载目录 |
CentOS 7 起,
/bin、/sbin、/lib、/lib64均为指向/usr/bin、/usr/sbin、/usr/lib、/usr/lib64的软链接;CentOS 6 中它们是独立的真实目录。因此在 CentOS 7 上type mount显示/usr/bin/mount,而 CentOS 6 上显示/bin/mount。
磁盘分区、挂载、文件系统类型等内容详见 阶段03 磁盘与文件系统管理。
四、路径与目录操作
4.1 绝对路径与相对路径
-
绝对路径:从根目录
/开始书写,与当前所在位置无关。cd /root/Desktop cd /etc/sysconfig/network-scripts/ -
相对路径:以当前所在目录为起点书写。
cd root/ # 进入当前目录下的 root 子目录 cd sysconfig/network-scripts/ # 当前已在 /etc 下时
特殊路径符号:
| 符号 | 含义 |
|---|---|
. |
当前目录 |
.. |
当前目录的父目录(上一级目录) |
- |
上一次所在的目录 |
~ |
当前登录用户的家目录 |
~用户名 |
指定用户的家目录(普通用户受权限限制,一般 root 使用) |
/ |
根目录 |
4.2 pwd:显示当前所在目录
pwd
# /root
4.3 cd:切换目录
cd 是 change directory 的缩写,是 Shell 内部命令。
| 命令 | 作用 |
|---|---|
cd 目录名 |
切换到指定目录(可用绝对路径或相对路径) |
cd |
不带参数,直接回到当前用户的家目录 |
cd ~ |
返回当前用户的家目录 |
cd ~用户名 |
进入指定用户的家目录(仅限 root 或有权限时使用) |
cd - |
在上一次工作目录和当前目录之间来回切换 |
cd .. |
返回上一级目录 |
cd ../.. |
返回上两级目录 |
cd / |
切换到根目录 |
4.4 mkdir:创建目录
# 在当前目录下创建 test 目录
mkdir test
mkdir ./test
# 一次创建多个目录
mkdir aaa bbb ccc
# 在 /tmp 下创建 test 目录
mkdir /tmp/test
# 回到家目录
cd ~
# 在当前目录下批量创建 file1 ~ file100 共 100 个目录
mkdir file{1..100}
# 创建名为 "file{1..100}" 的单个目录(用引号阻止大括号展开)
mkdir "file{1..100}"
# 递归创建多级目录树 a/b/c(不加 -p 会因中间目录不存在而报错)
mkdir -p a/b/c
| 选项 | 作用 |
|---|---|
-p |
递归创建多级目录;目标已存在时也不报错 |
-v |
显示创建过程 |
-m |
创建时直接指定权限,如 mkdir -m 755 dir |
提示:原始讲义中出现的
mkdier为笔误,正确命令是mkdir。
一次性创建复杂目录树的写法:
mkdir -p test/a/b/c/d/{c,e,v,x,z} test/a/b/c/{h,i,j} test/a/b/g test/a/f
4.5 rmdir:删除空目录
rmdir 只能删除空目录:
rmdir test # 删除当前目录下的空目录 test
rmdir /tmp/test # 删除 /tmp 下的空目录 test
rmdir file{1..100} # 批量删除空目录
rmdir "file{1..100}" # 删除名为 file{1..100} 的目录
rmdir -p a/b/c # 递归删除空目录链 c、b、a
目录非空时请使用 rm -r(见下一节)。
五、文件操作
5.1 ls:列出目录内容
ls # 列出当前目录下的文件和子目录
ls /etc # 列出指定目录内容
ls -a # 显示所有文件,包括隐藏文件(以 . 开头)
ls -l # 以详细列表(长格式)形式显示
ls -l /etc # 长格式列出指定目录
ls -R # 递归显示所有子目录内容
ls -al # 组合使用:所有文件的详细信息
ls -lt # 按修改时间排序
ls -lh # 以 KB/MB/GB 等人类可读单位显示大小
ls -ld /etc # 查看目录本身的详细信息,而不是目录内的内容
ls -i # 显示 inode 号
常用组合速查:
| 命令 | 作用 |
|---|---|
ls -al |
列出所有文件(含隐藏文件)的详细信息 |
ls -lt |
按修改时间排序 |
ls -lh |
以人类可读的单位显示大小 |
ls -ld 目录名 |
查看目录本身的详细信息 |
ll |
ls -l 的别名(系统预置) |
5.2 ls -l 输出字段详解
-rw-r--r--. 1 root root 62486 8月 16 23:10 install.log
drwxr-xr-x 2 root root 4096 8月 18 03:22 jiami
-rwxr-xr-x 1 root root 2062 9月 20 17:30 0_env.txt
-rwxr-xr-x 1 root root 2062 Sep 20 17:30 file.txt
|权限 |链接|用户|组 |大小 |修改时间 |文件名
| 位置 / 字段 | 含义 |
|---|---|
| 第 1 位 | 文件类型(见下表) |
| 第 2-10 位 | 文件权限,共 9 位,分三组(属主/属组/其他),每组 rwx(读、写、执行) |
第 11 位的 . |
表示该文件带有 SELinux 安全上下文 |
| 链接数 | 硬链接次数;目录的链接数与其子目录数量相关 |
| 属主 | 文件所有者(owner) |
| 属组 | 文件所属组(group) |
| 大小 | 文件大小,默认单位为字节 |
| 时间戳 | 最近一次被修改的时间(modify time) |
| 文件名 | 文件名称 |
文件类型标识
| 字符 | 类型 | 说明 |
|---|---|---|
- |
普通文件 | 一般的文本、二进制文件等 |
d |
目录文件 | directory |
c |
字符设备文件 | character,如终端、串口等按字符访问的接口设备 |
b |
块设备文件 | block,如硬盘及其分区,一般不手动创建 |
l |
符号链接文件 | 软链接,指向另一个文件路径 |
s |
socket 文件 | 套接字,用于进程间/网络数据通信 |
p |
命名管道文件 | pipe,用于进程之间的通信 |
权限位的读法与修改(
chmod、chown、umask、特殊权限)详见 阶段02 用户与权限管理。
三种时间戳
- Access(atime):访问时间,读取文件内容时更新。
- Modify(mtime):修改时间,文件内容发生改变时更新,
ls -l默认显示的就是 mtime。 - Change(ctime):改变时间,文件元数据(属性)发生改变时更新,如权限、属主、链接数变化。
5.3 stat:查看文件元数据
stat 文件名
File: `1'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 802h/2050d Inode: 4718598 Links: 1
Access: (0644/-rw-r--r--) Uid: (0/root) Gid: (0/root)
Access: 2015-07-02 15:32:50.951967259 +0800
Modify: 2015-07-02 15:32:50.951967259 +0800
Change: 2015-07-02 15:32:50.951967259 +0800
关键概念:
- block(块):操作系统一次 I/O 的最小单位,系统块默认大小为 4096 字节(类似 Windows 的簇)。
- inode:文件系统给每个文件分配的编号,类似门牌号,保存文件的元数据(权限、属主、大小、数据块位置等),但不保存文件名。
块大小的权衡:
- 块大:一次 I/O 数据量大,吞吐量大,但小文件的空间浪费多。
- 块小:空间利用率高,但 I/O 吞吐量小。
inode 耗尽、块大小调整、文件系统格式化参数等内容详见 阶段03 磁盘与文件系统管理。
5.4 链接文件与 ln
硬链接
硬链接不为文件新建 inode,而是为原文件创建一个额外的目录项,与原文件共用同一个 inode。每创建一个硬链接,ls -l 第二列的链接数加 1。只要链接数不为 0,文件数据就不会被真正删除。
限制:
- 不能对目录创建硬链接。
- 不能跨文件系统(跨分区)创建硬链接。
软链接(符号链接)
软链接类似 Windows 的快捷方式,是一个独立的新文件,拥有自己的 inode,其内容指向源文件的路径。删除软链接不影响源文件;删除源文件后软链接会失效(变为“断链”),但如果在同路径重建同名文件,软链接会自动恢复指向。
lrwxrwxrwx 1 root root 7 9月 28 10:02 234 -> 234.txt
创建链接:ln
ln [选项] 源文件 [目标文件]
| 命令 | 作用 |
|---|---|
ln /test/1.txt /1 |
创建硬链接 |
ln -s /test/1.txt /1 |
创建软链接(-s 表示 symbolic) |
ln -s 源文件 链接文件 |
软链接,指向文件系统中的路径 |
ln 源文件 链接文件 |
硬链接,指向硬盘上的同一 inode |
示例:
vim test.txt
ln -s test.txt test_link # 为 test.txt 创建软链接
ls -l test_link # 观察 l 类型与 -> 指向
5.5 touch:创建文件或更新时间戳
touch file # file 不存在则创建空文件;存在则更新存取/修改时间,不覆盖内容
touch 1 # 创建名为 1 的空文件
touch -c file # 仅在 file 存在时更新时间,不存在则不创建
touch -r file1 file # 让 file 的时间与 file1 相同
touch -a file # 仅更新存取时间(atime)
touch -m file # 仅更新修改时间(mtime)
touch -t 202601011200 file # 指定时间戳(格式 YYYYMMDDhhmm)
touch 2 3 4 5 # 一次创建多个文件
touch file2 file3 file4 # 同时创建多个文件
touch file{2,3,4} # 同上,使用大括号展开
touch "file{2,3,4}" # 创建名为 file{2,3,4} 的单个文件
touch {1..10} # 创建 1~10 共 10 个文件
touch {1..100}.php # 创建 100 个 .php 文件
5.6 cp:复制文件或目录
cp 源文件 目标位置 # 拷贝文件
cp file dirs # 把 file 复制到 dirs 目录下
cp 1 1.txt # 拷贝的同时重命名
cp -r 源目录 目标位置 # 拷贝目录必须加 -r(递归)
cp -r dir1 dir2 # 把目录 dir1 递归复制到 dir2
cp -a file dir2 # 复制时保留文件原属性(归档模式)
cp -rf file dir2 # 强制复制,不提示
cp -rvf dir1 dir2 # 递归复制并显示复制过程
cp -u dir1/* dir2/ # 仅复制更新过的文件
常用选项:
| 选项 | 作用 |
|---|---|
-r / -R |
递归复制目录 |
-i |
覆盖前提示确认(系统默认别名中常被启用) |
-u |
仅当源文件比目标文件新时才复制(update) |
-v |
显示复制过程 |
-t |
指定目标路径,适合一次复制多个文件 |
-f |
强制覆盖,不提示 |
-a |
归档模式,保留权限、时间戳、属主等属性,等同于 -dR --preserve=all |
-p |
保留权限、时间戳等属性 |
-d |
复制软链接本身而不是其指向的文件 |
5.7 mv:移动或重命名
mv 源文件 目标位置 # 移动文件
mv file dirs/ # 把 file 移动到 dirs 目录下
mv abc /tmp/ # 移动目录(不需要 -r)
mv file file2 # 将 file 重命名为 file2
mv 1 2 # 重命名(同目录下移动即重命名)
mv -u dir1/* dir2/ # 仅在源文件比目标文件新时才移动
mv -i file dir/ # 覆盖前提示
mv -f file dir/ # 强制覆盖
mv在同一文件系统内只修改目录项,不搬运数据,因此移动大目录非常快;跨文件系统移动则等价于“复制 + 删除”。
5.8 rename:批量重命名
rename .conf .html *.conf
rename .txt .php *.txt
三个参数依次为:原字符串、新字符串、要处理的文件匹配规则。例如 rename .txt .php *.txt 会把当前目录下所有 .txt 文件的后缀替换为 .php。
需要注意:
- 只作用于当前目录下的文件名(匹配规则由 Shell 通配符展开)。
- 一个文件名中如果出现多个待替换串,命令每执行一次只会替换其中第一个,因此多执行几次会逐段替换。
5.9 rm:删除文件或目录
rm 文件名 # 删除文件(系统默认别名 rm -i,会提示确认)
rm -i file # 删除前提示确认
rm -f file # 强制删除,不提示
rm -r dir # 递归删除目录
rm -rf 目录名 # 强制递归删除目录(危险!)
rm file* -rf # 强制递归删除所有 file 开头的文件/目录
rm *.txt # 删除所有 .txt 结尾的文件
rm -rfv dir # 递归、强制并显示删除过程
常用参数组合为 -rfv:递归、强制、显示过程。
警告:
rm -rf是高危命令。滥用可能导致系统关键目录被删、系统无法开机。使用前务必确认目标路径没有写错,尤其注意不要在路径中误加空格(如rm -rf / tmp与rm -rf /tmp后果完全不同)。
5.10 文件操作速查
| 任务 | 命令 |
|---|---|
| 创建文件 | touch file |
| 创建目录 | mkdir -p dir |
| 复制 | cp -r src dst |
| 移动/重命名 | mv old new |
| 删除文件 | rm file |
| 删除目录 | rm -rf dir |
| 查看内容 | cat file |
| 实时看日志 | tail -f file |
| 查找文件内容 | grep keyword file |
| 按条件查找文件 | find /path -name "*.log" |
grep、sed、awk、find的完整用法详见 06-02-文本处理与文件查找.md。tar、gzip、zip等压缩与归档命令详见 阶段05 进程管理与压缩归档。
六、文件内容查看
| 命令 | 说明 | 示例 |
|---|---|---|
cat |
一次性输出整个文件内容 | cat /etc/passwd |
head |
查看文件开头前 N 行/字符 | head -n 30 /etc/passwd |
tail |
查看文件末尾后 N 行/字符,可实时跟踪 | tail -f /var/log/messages |
more |
分屏查看(主要向下) | more /etc/passwd |
less |
分屏查看,支持上下翻页 | less /etc/passwd |
6.1 cat:一次性输出整个文件
cat /etc/passwd # 查看文件内容
cat /etc/hosts
cat -n /etc/passwd # 显示行号(包括空行)
cat -b /etc/passwd # 仅给非空行编号
cat -s /etc/passwd # 将多个连续(相邻)空行合并成一个空行
cat -A /etc/passwd # 显示所有不可见字符(制表符、行尾 $)
cat file1 file2 > file3 # 合并多个文件到 file3
cat 适合查看短文件;文件很长时会瞬间刷屏,应改用 less、head 或 tail。
6.2 head:查看文件开头
head /etc/passwd # 默认查看前 10 行
head -5 /etc/passwd # 显示前 5 行(简写形式)
head -n 20 /etc/passwd # 查看前 20 行
head -n 30 /etc/passwd # 查看前 30 行
head -c 30 /etc/passwd # 查看前 30 个字符
head -n 1 /etc/issue # 查看操作系统版本信息(第一行)
6.3 tail:查看文件末尾
tail /etc/passwd # 默认查看后 10 行
tail -5 /etc/passwd # 显示最后 5 行
tail -n 30 /etc/passwd # 查看后 30 行
tail -c 30 /etc/passwd # 查看后 30 个字符
tail -f /var/log/messages # 实时跟踪文件内容变化(常用于监控日志)
tail -f 1_passwd # 实时跟踪指定文件
tail -n +10 /etc/passwd # 从第 10 行开始显示到文件末尾
tail -f 实验:开两个终端,一个执行 tail -f 1.txt,另一个执行 echo hello >> 1.txt,第一个终端会实时显示新增内容。按 Ctrl + C 结束跟踪。
6.4 more:分屏查看(只能向下)
more /etc/passwd
more -10 /etc/passwd # 每屏显示 10 行
more -dc /etc/passwd # 显示前先清屏,并在底部显示详细提示
操作按键:
| 按键 | 作用 |
|---|---|
Space |
下一页 |
Enter |
下一行 |
b |
上一页 |
h |
帮助 |
q |
退出 |
6.5 less:分屏查看(可上下翻页,推荐)
less 可以上下自由滚动,比 more 更灵活,是 man 手册所使用的分页器:
less /etc/passwd # 查看文件
less -N /etc/passwd # 显示行号
less -m /etc/passwd # 显示类似 more 的百分比进度
| 按键 | 作用 |
|---|---|
PageUp / PageDown |
上下翻页 |
空格 |
下一页 |
↑ / ↓ |
上下滚动一行 |
/关键字 |
向后搜索,n / N 切换匹配 |
g / G |
跳到文件开头 / 结尾 |
q |
退出 |
七、输入输出重定向与管道
7.1 三个标准流
| 名称 | 文件描述符 | 默认设备 |
|---|---|---|
| 标准输入(stdin) | 0 | 键盘 |
| 标准输出(stdout) | 1 | 屏幕 |
| 错误输出(stderr) | 2 | 屏幕 |
7.2 输出重定向
# 标准正确输出重定向到 output.txt(覆盖写)
ls -hl /etc/passwd > output.txt
ls /etc/passwd > output.txt
# 标准正确输出追加重定向到 output.txt
ls -hl /etc/passwd >> output.txt
# 标准错误输出重定向到 error.txt
ls -hl ddd 2> error.txt
cat nofile 2> error.txt
# 标准错误输出重定向到黑洞设备(丢弃)
ls -hl dddd 2> /dev/null
cat nofile 2> /dev/null
# 标准正确输出和错误输出全部重定向到黑洞
ls ddddd /etc/passwd &> /dev/null
# 分别重定向正确输出与错误输出
ls ddddd /etc/passwd > ok.txt 2> err.txt
# 将错误输出合并到标准输出所在位置
ls ddddd /etc/passwd > all.txt 2>&1
> 与 >> 的区别:
| 符号 | 作用 |
|---|---|
> |
输出重定向,先清空文件再写入 |
>> |
追加输出重定向,从文件最后一个有效字符的下一行开始拼接 |
实用技巧:在不打开、不删除、不创建同名文件的前提下清空一个普通文件:
> file # 直接把空内容重定向进去
: > file # 等效写法
7.3 输入重定向
< 将文件内容作为命令的标准输入:
wc -l < /etc/passwd # 把 /etc/passwd 作为 wc -l 的输入源
<< 称为 Here-document(此处文档),后面跟结束标识符,将两个标识符之间的内容作为标准输入:
wc -l << EOF
hello world
hello linux
bye
EOF
注意事项:
- 第一个标识符与
<<之间建议留一个空格(可不留,但为可读性建议加上)。 - 第二个标识符必须单独占一行,行首不能有任何有效字符,行尾也不能有任何有效字符(换行符除外)。
<<< 称为 Here-string(此处字符串),将后面的字符串作为命令的标准输入:
cat <<< "hello world"
wc -l <<< "hello world"
# 多行字符串需要用引号括起来
wc -l <<< "hello world
hello linux
hello shell
"
<<< 与 << 的不同在于:Here-string 的结束引号一旦出现就结束输入,不像 Here-document 要求结束符单独成行。
7.4 管道
管道使用 | 连接多个命令,将前一个命令的标准输出作为后一个命令的标准输入:
cat /etc/passwd | less
cat /etc/passwd | wc -l
ls -l /etc | head -20
一般格式:
命令1 | 命令2 | 命令3 ... | 命令n
多重管道能持续工作的前提是:每个命令既能从标准输入读取,又能向标准输出写出,输入和输出不能中断。
管道只传递标准输出。若要把错误输出也送入管道,使用
命令 2>&1 | 命令2或命令 |& 命令2(Bash 4+)。
八、通配符、大括号展开与引号
8.1 通配符
通配符由 Shell 负责展开,展开后的结果才交给命令执行。
| 通配符 | 含义 |
|---|---|
* |
匹配 0 个或多个任意字符 |
? |
匹配单个任意字符 |
[a-z] |
匹配范围内的单个小写字母 |
[0-9] |
匹配单个数字 |
[abc] |
匹配 a、b、c 中的任意一个字符 |
[^abc] |
匹配除 a、b、c 之外的任意单个字符 |
cp *.txt /test/ # 复制当前目录下所有 .txt 文件到 /test/
ls file? # 匹配 file1、fileA 等(? 只代表一个字符)
rm *.txt # 删除所有 .txt 文件
ls [0-9]* # 列出以数字开头的文件
8.2 大括号展开与批量操作
touch {a..z}.txt # 批量创建 a.txt ~ z.txt
touch {1..5}{a..z} # 批量创建组合文件名(1a、1b ... 5z)
mkdir file{1..100} # 批量创建 100 个目录
touch file{2,3,4} # 创建 file2、file3、file4
echo {1..10} # 1 2 3 4 5 6 7 8 9 10
echo {10..1} # 倒序
echo {a..z} # a 到 z
echo {1..10..2} # 步长为 2:1 3 5 7 9
大括号展开中,{1..10} 的两个点是固定写法;{1..10..2} 最后的 ..2 表示步长。大括号展开不要求文件存在,而通配符只能匹配已存在的文件,这是两者的本质区别。
8.3 引号规则
| 写法 | 作用 |
|---|---|
"双引号" |
弱引用:保留大部分字面含义,但仍会解析 $变量、反引号命令替换与 \ 转义 |
'单引号' |
强引用:内部所有字符都是字面量,不做任何解析 |
`命令` 或 $(命令) |
命令替换:把命令的输出作为字符串使用 |
\字符 |
转义单个字符 |
echo "$HOME" # 输出 /root(变量被解析)
echo '$HOME' # 输出 $HOME(原样输出)
mkdir "file{1..100}" # 引号阻止大括号展开,创建单个目录
touch "my file.txt" # 文件名含空格时必须加引号
echo "今天是 $(date +%F)" # 命令替换
8.4 seq:生成数字序列
seq 1 10 # 1 到 10,每行一个
seq 10 # 等价于 seq 1 10
seq -s ":" 1 10 # 用冒号分隔:1:2:3:...:10
seq -w -s ":" 1 2 100 # 等宽(补零)+ 步长 2
seq 1 2 10 # 从 1 开始,步长 2,到 10(1 3 5 7 9)
| 选项 | 作用 |
|---|---|
-s |
指定分隔符 |
-w |
等宽显示,位数对齐(补零) |
8.5 命令别名与命令定位
which / whereis:查看命令路径与别名
which ls
# alias ls='ls --color=auto'
# /bin/ls
which ll
whereis ls # 显示命令的二进制、源码、手册页位置
alias / unalias:查看与设置别名
alias # 查看当前所有别名
alias c='clear' # 定义别名
alias dir='dir --color=auto'
unalias c # 取消别名
\ls # 在命令前加 \ 可临时绕过别名,执行原命令
系统默认的安全别名(root 用户定义在 /root/.bashrc):
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
-i 表示交互确认,防止误操作。
检查别名是否已被占用
想给某条命令起别名前,先在终端直接敲这个名字,如果提示 command not found,说明该名字可用:
drm
# -bash: drm: command not found
别名的生效范围
- 直接在终端用
alias定义:临时有效,关闭终端后失效。 - 写入配置文件:永久有效。
永久生效的方法:
vim ~/.bashrc
# 在文件中加入:
alias c='clear'
alias dir='dir --color=auto'
source ~/.bashrc # 让配置立即生效
# 或
. ~/.bashrc
Bash 配置文件的加载顺序(
/etc/profile、~/.bash_profile、~/.bashrc)与环境变量设置详见 阶段02 服务管理与 Shell 环境。
九、系统信息查询
9.1 uname / hostname:内核与主机信息
uname -a # 显示内核版本、主机名、硬件架构等全部信息
uname -r # 只显示内核版本
uname -m # 显示硬件架构(如 x86_64)
uname -s # 显示内核名称(Linux)
hostname # 查看计算机名(主机名)
查看发行版版本:
cat /etc/redhat-release # 显示 CentOS/RHEL 发行版版本
head -n 1 /etc/issue # 查看操作系统版本
cat /etc/os-release # CentOS 7 提供的标准发行版信息文件
版本差异:修改主机名在 CentOS 6 中编辑
/etc/sysconfig/network的HOSTNAME=并重启生效;在 CentOS 7 中使用hostnamectl set-hostname 新主机名(配置文件为/etc/hostname),立即生效。网络配置详见 阶段07 网络配置与远程管理。
9.2 硬件与内核模块信息
| 命令 | 说明 |
|---|---|
cat /proc/cpuinfo |
查看 CPU 信息 |
lspci -tv |
以树形列出所有 PCI 设备 |
lsusb -tv |
以树形列出所有 USB 设备 |
lsmod |
列出已加载的内核模块 |
env |
查看环境变量 |
dmesg \| grep IDE |
查看启动时 IDE 设备检测状况 |
9.3 date:显示或设置系统时间
date
# 2017年 02月 20日 星期一 17:14:04 CST
常用格式化符号:
| 符号 | 含义 |
|---|---|
%Y |
完整年份(0000-9999) |
%m |
月份(01-12) |
%d |
日(01-31) |
%H |
小时(00-23) |
%M |
分钟(00-59) |
%S |
秒(00-60) |
%F |
完整日期,等价于 %Y-%m-%d |
%T |
直接显示时间(24 小时制,等价于 %H:%M:%S) |
%s |
从 1970-01-01 00:00:00 UTC 到现在的秒数(时间戳) |
格式化输出:
date "+%Y-%m-%d %H:%M:%S"
date +"%Y" # 年
date +"%m" # 月
date +"%d" # 日
date +"%F" # 年-月-日
date +%T # 时:分:秒
时间运算(-d 选项):
date "+%Y-%m-%d %H:%M:%S" -d "-3 year" # 三年前
date "+%Y-%m-%d %H:%M:%S" -d "+3 month" # 三个月后
date -d "2026-01-01 +10 day" # 指定日期后 10 天
date -d "yesterday" +%F # 昨天的日期
设置系统时间(-s 选项,需 root):
date -s "20100809 10:10:10"
date -s "2010-08-09 10:10:10"
date -s "2010/08/09 10:10:10"
date -s "2026-01-01 12:00:00"
date -s "2024-01-01 12:00"
时间同步(NTP / chrony)与硬件时钟
hwclock详见 阶段08 时间同步与超级守护进程。
9.4 cal:显示日历
cal # 显示当月日历
cal 9 2017 # 显示指定年月的日历
cal -y 2013 # 显示指定年份的全年日历
cal -j # 显示当年第几天(从 1 月 1 日起算的儒略日)
9.5 登录用户与运行状态
| 命令 | 作用 |
|---|---|
whoami |
显示当前登录用户名 |
who |
显示当前系统登录信息(用户、终端、登录时间) |
who am i |
显示当前终端的详细信息 |
w |
显示比 who 更详细的登录信息(含负载、用户正在执行的命令) |
users |
仅显示登录用户名列表(who 的第一列) |
id |
显示当前用户的 UID、GID 与所属组 |
id <用户名> |
查看指定用户的 UID/GID 信息 |
last |
查看用户登录日志(历史登录记录) |
lastlog |
查看每个用户最后一次登录时间 |
tty |
显示当前终端设备(如 /dev/pts/0) |
uptime |
显示系统当前时间、运行时长、登录用户数和平均负载 |
cat /proc/loadavg |
直接查看系统负载原始数据 |
top |
动态查看系统负载与进程状态(CPU、内存、Swap 等) |
ps -ef |
查看所有进程 |
uptime 输出中的三个负载值分别代表最近 1 分钟、5 分钟、15 分钟的平均负载。
uptime
w
who
id root
last | head
进程状态详解、
top各字段含义、kill信号、计划任务等内容详见 阶段04 进程与任务管理。 用户账号的创建与密码策略(useradd、usermod、passwd -l等)详见 阶段02 用户与权限管理。
9.6 passwd:修改密码
passwd # 修改当前用户密码
passwd abc # root 修改 abc 用户的密码(仅 root 可指定用户名)
普通用户改密码的限制:
- 必须先输入旧密码。
- 密码复杂度要求严格,过于简单会被拒绝。
root 用户改密码不受长度和复杂度限制(仅会给出警告提示)。
完整的用户与口令管理详见 阶段02 用户与权限管理。
9.7 查看系统所有用户与组
cut -d: -f1 /etc/passwd # 查看系统所有用户
cut -d: -f1 /etc/group # 查看系统所有组
crontab -l # 查看当前用户的计划任务
十、常用工具(下半)
10.1 df:查看磁盘分区使用情况
df -h # 以人类可读单位查看各分区使用情况(最常用)
df -T # 同时显示文件系统类型
df -i # 查看 inode 使用情况
df -h / # 只看根分区
10.2 du:查看目录/文件占用空间
du -sh <目录名> # 查看指定目录的总大小(summarize + human-readable)
du -sh * # 查看当前目录下每个子项的大小
du -h --max-depth=1 /var # 只统计到第一层子目录
du -sh /var/log # 查看日志目录占用
| 选项 | 作用 |
|---|---|
-s |
只显示总计,不逐个列出子目录 |
-h |
人类可读单位 |
--max-depth=N |
限制统计深度 |
df统计的是文件系统层面的已用/可用空间,du统计的是文件实际占用的空间;删除了文件但进程仍持有句柄时,两者结果会出现差异。磁盘管理详见 阶段03 磁盘与文件系统管理。
10.3 free:查看内存与交换分区
free -m # 以 MB 为单位查看内存和交换区使用量
free -h # 以人类可读单位显示
free -g # 以 GB 为单位
grep MemTotal /proc/meminfo # 查看内存总量
grep MemFree /proc/meminfo # 查看空闲内存量
版本差异:CentOS 6 的
free输出中有单独的-/+ buffers/cache行,需要用“已用 - 缓存”来估算真实占用;CentOS 7 的free直接提供available列,更准确地反映可用内存。
10.4 磁盘和分区相关速查
| 命令 | 说明 |
|---|---|
mount \| column -t |
以表格对齐方式查看已挂接的分区状态 |
fdisk -l |
查看所有分区 |
swapon -s |
查看所有交换分区 |
hdparm -i /dev/hda |
查看磁盘参数(仅适用于 IDE 设备) |
详见 阶段03 磁盘与文件系统管理。
10.5 echo:输出内容
echo 123 # 输出 123
echo "hello world"
echo -e "hello\nworld\n" # -e 解释转义字符(如 \n 换行、\t 制表符)
echo -n "hello world" # -n 取消末尾自动换行
echo "$HOME" # 输出变量值
echo hello >> 1.txt # 配合追加重定向写文件
echo {1..10} # 配合大括号展开输出序列
10.6 read:读取用户输入
read # 不指定变量时,输入存入内置变量 REPLY
echo $REPLY
read v # 将输入存入变量 v
echo "$v"
read -p "请输入名称:" name # -p 显示提示信息
read -s pass # -s 静默输入(不回显,适合输入密码)
read -t 5 v # -t 超时秒数
read常用于 Shell 脚本中与用户交互,详见 阶段05 Shell 脚本编程。
10.7 wc:统计行数、单词数、字节数
wc /etc/passwd # 依次输出 行数 单词数 字节数 文件名
wc -l /etc/passwd # 只统计行数(最常用)
wc -w /etc/passwd # 统计单词数
wc -c /etc/passwd # 统计字节数
wc -L /etc/passwd # 显示最长行的长度
cat /etc/passwd | wc -l # 配合管道统计
wc -l < /etc/passwd # 配合输入重定向(输出不带文件名)
10.8 sort:排序
sort file # 按字典序升序排序
sort -r file # 逆序
sort -n file # 按数值大小排序
sort -u file # 排序并去除重复行
sort -k 2 file # 按第 2 列排序
sort -t: -k 3 -n /etc/passwd # 以 : 为分隔符,按第 3 列(UID)数值排序
10.9 uniq:去除相邻重复行
sort file | uniq # 先排序再去重(uniq 只能处理相邻重复行)
sort file | uniq -c # 统计每行出现的次数
sort file | uniq -d # 只显示重复的行
sort file | uniq -u # 只显示不重复的行
10.10 cut:按列截取
cut -d: -f1 /etc/passwd # 以 : 为分隔符取第 1 列(用户名)
cut -d: -f1,3 /etc/passwd # 同时取第 1、3 列
cut -c1-5 /etc/passwd # 按字符位置截取第 1~5 个字符
| 选项 | 作用 |
|---|---|
-d |
指定字段分隔符(默认制表符) |
-f |
指定要取的字段序号 |
-c |
按字符位置截取 |
10.11 tr:字符替换与删除
echo "hello" | tr 'a-z' 'A-Z' # 小写转大写
cat file | tr -d ' ' # 删除所有空格
cat file | tr -s ' ' # 压缩连续重复的空格为一个
echo "hello" | tr 'l' 'L' # 把字符 l 替换为 L
10.12 diff:比较文件差异
diff file1 file2 # 逐行比较两个文件的差异
diff -u file1 file2 # 统一格式(unified)输出,常用于生成补丁
diff -r dir1 dir2 # 递归比较两个目录
diff -y file1 file2 # 并排显示差异
10.13 bc:命令行计算器
bc # 进入交互模式,quit 退出
bc <<< "(5+4)/3" # 基本运算(整数运算会截断小数)
bc <<< "scale=3;10/3" # scale 指定小数位数
bc <<< "ibase=2;101" # 把二进制 101 转为十进制
bc <<< "ibase=2;obase=16;1010" # 二进制转十六进制
echo "3*4" | bc # 配合管道使用
10.14 clear:清屏
clear # 清屏,或直接按 Ctrl + L
10.15 openssl:加密工具
openssl 是一个功能强大的加密工具集,可用于生成密钥、证书、计算摘要、加解密等:
openssl rand -base64 12 # 生成 12 字节的随机密码
openssl passwd -1 "123456" # 生成 MD5 格式的加密口令
HTTPS 证书生成、SSL 配置等实际应用详见 阶段10 Web 服务与架构(Nginx HTTPS 配置)。
10.16 常用设备文件
| 设备文件 | 作用 |
|---|---|
/dev/null |
空洞(黑洞)文件,写入的任何数据都会被丢弃,常用于丢弃不需要的输出 |
/dev/zero |
读取时无限提供零字节,常用于生成指定大小的空文件(配合 dd) |
/dev/urandom |
读取时无限提供随机二进制数据,常用于生成随机密钥/密码 |
ls dddd 2> /dev/null # 丢弃错误输出
dd if=/dev/zero of=/tmp/bigfile bs=1M count=100 # 生成 100MB 的文件
head -c 16 /dev/urandom | base64 # 生成随机字符串
十一、终端复用:screen 与 tmux
终端复用工具解决的核心问题是:SSH 连接断开后,正在运行的任务会随终端一起被终止。使用终端复用工具后,会话中的程序仍可继续运行,重连后能还原上次的操作界面。
11.1 screen(早期常用)
screen 是较早期的终端复用工具,在老系统上更常见:
yum install screen -y
screen # 创建新会话
screen -S mysession # 创建并命名会话
screen -ls # 列出所有会话
screen -r mysession # 重新连接(恢复)会话
Ctrl + a d # 分离当前会话(detach)
exit # 关闭当前会话窗口
screen 的前缀键是 Ctrl + a。功能上 tmux 是它的现代替代品,配置更灵活、分屏更方便,推荐优先学习 tmux。
11.2 tmux 安装与配置
tmux 是一个开源的终端管理工具,可以在一个终端中管理多个会话(session)、窗口(window) 和 窗格(pane)。
sudo yum install tmux -y
用户配置文件位于 ~/.tmux.conf。课程中可从 NFS 共享目录拷贝预配置:
sudo mount 192.168.0.89:/soul /mnt
cd /mnt/software
cp tmux.conf ~/.tmux.conf
tmux 的前缀键默认为 Ctrl + b,下文统一记作 Prefix。
11.3 会话管理
会话用于解决“连接断开后任务丢失”的问题。
| 操作 | 命令/快捷键 |
|---|---|
| 创建会话 | tmux 或 tmux new-session -s 会话名称(简写 tmux new -s name) |
| 查看会话列表 | tmux list-session(简写 tmux ls) |
| 分离(挂起)会话 | Prefix d 或 Prefix D(即 Ctrl + b d) |
| 唤醒(附加)会话 | tmux attach -t 会话名称 |
| 选择会话 | Prefix s,用上下键选择后回车 |
| 关闭会话 | 退出会话内所有终端,或 tmux kill-session -t 会话名称 |
| 重命名会话 | Prefix $ |
11.4 窗口
一个会话中至少包含一个窗口(以标签形式显示在状态栏)。
| 操作 | 快捷键/命令 |
|---|---|
| 创建窗口 | Prefix c |
| 关闭窗口 | 退出该窗口的 bash,或 Prefix & |
| 列出窗口 | Prefix w |
| 选择窗口 | Prefix 0、Prefix 1 ... Prefix 9 |
| 配置后快速切换 | Alt + 1 ~ Alt + 9 |
11.5 窗格(分屏)
一个窗口中可以划分多个窗格。
| 操作 | 快捷键 |
|---|---|
| 竖向分屏 | Prefix + | |
| 横向分屏 | Prefix - |
| 关闭当前窗格 | Prefix x |
| 在窗格间切换 | Prefix h / j / k / l |
上述
|、-、hjkl的绑定来自下文的自定义配置;tmux 默认绑定为Prefix "(横分屏)、Prefix %(竖分屏)和Prefix+ 方向键切换。
11.6 滚动与复制粘贴
tmux 自带复制模式,需要 xclip 工具与系统剪贴板交互:
sudo yum install xclip -y
| 操作 | 快捷键 |
|---|---|
| 进入复制模式 | Prefix y(自定义绑定;默认为 Prefix [) |
| 选取 | v(按字符)或 V(按行) |
| 复制 | y(复制并退出复制模式) |
| 粘贴 | Prefix p |
操作流程示例:
ip a s
Prefix y # 进入 vi 风格的复制模式
V # 按行选取
y # 复制到系统剪贴板
Prefix p # 粘贴
11.7 tmux 配置示例
以下是一份常用的 ~/.tmux.conf 配置,主要涵盖:
- 状态栏位置、配色与窗口列表样式;
- 消息栏与命令行配色;
- 窗口自动重命名、关闭后自动重新编号;
- 拷贝模式使用 vi 风格按键,并通过
xclip与系统剪贴板互通; - 使用
|和-进行水平 / 垂直分屏,使用hjkl切换窗格; Alt + 0~9快速切换窗口;- 前缀键 +
r重新加载配置。
配置中前缀键(默认 Ctrl+b)的更换以及鼠标支持等选项以注释形式保留,可按需取消注释启用。
# 解绑 Ctrl+b 快捷键
# unbind C-b
# 更换前缀快捷键为 Ctrl+a
# set -g prefix C-a
# Tmux 会话选项
set -g status-keys vi
# 开启鼠标模式
# set -g mode-mouse on
# set -g monitor-activity on
# set -g xterm-keys on
# 设置默认终端配色
# set -g default-terminal "screen-256color"
# 自动重命名窗口名字
set -g automatic-rename on
# 关闭窗口后自动重新分配 ID
set -g renumber-windows on
# 开启鼠标点击选择窗格
# set -g mouse-select-pane on
# 开启鼠标点击选择窗口
# set -g mouse-select-window on
# 开启鼠标调节窗格大小
# set -g mouse-resize-pane on
# 美化窗格栏
# set -g pane-active-border-bg none
# set -g pane-active-border-fg red
# set -g display-panes-active-colour red
# 美化信息栏
set -g message-bg blue
set -g message-fg white
# 美化命令行
set -g message-command-bg cyan
set -g message-command-fg white
# black blue red green yellow white cyan magenta
# 美化标题栏
# set -g status on
set -g status-position top
set -g status-fg black
set -g status-bg white
set -g status-justify centre
# set -g status-justify left
set -g status-left '#[fg=black,bold][#S]'
# set -g status-left-length 20
set -g status-right '#[fg=black,bold][%Y-%m-%d %H:%M]'
set -g window-status-format ' #[fg=black,bold]#I:#W '
set -g window-status-current-format ' #[fg=white,bold]* #I:#W *#[fg=black] '
set -g window-status-fg black
set -g window-status-bg white
set -g window-status-current-fg white
set -g window-status-current-bg black
# 每当修改 tmux.conf 后,按前缀键 + r 重新加载配置立即生效
bind-key r source-file ~/.tmux.conf \; display-message "Config Reloaded."
# 拷贝模式按键重定义
set -g mode-keys vi
# 定义前缀键 + y 进入拷贝模式
bind-key y copy-mode
# 定义使用 v 进行选取
bind-key -t vi-copy v begin-selection
# 定义使用 y 复制并加入到系统剪贴板
bind-key -t vi-copy y copy-pipe "xclip -i -sel clip > /dev/null"
# 定义前缀键 + p 粘贴
bind-key p run "xclip -o -sel clip | tmux load-buffer - ; tmux paste-buffer"
# 重定义分隔窗格快捷键
unbind '"'
unbind %
bind-key | split-window -h
bind-key - split-window -v
# 重定义选择窗格快捷键(使用 hjkl 风格)
bind k selectp -U
bind j selectp -D
bind h selectp -L
bind l selectp -R
# 重定义新建窗口快捷键
# bind-key -n C-T new-window
# 重定义窗口选择快捷键为 Alt + 0~9
bind-key -n M-1 select-window -t :0
bind-key -n M-2 select-window -t :1
bind-key -n M-3 select-window -t :2
bind-key -n M-4 select-window -t :3
bind-key -n M-5 select-window -t :4
bind-key -n M-6 select-window -t :5
bind-key -n M-7 select-window -t :6
bind-key -n M-8 select-window -t :7
bind-key -n M-9 select-window -t :8
bind-key -n M-0 select-window -t :9
11.8 配置要点速查
| 分类 | 关键配置 / 快捷键 | 说明 |
|---|---|---|
| 前缀键 | C-b(默认)/ C-a(注释示例) |
tmux 所有快捷键的引导键 |
| 状态栏 | status-position top、status-left/right |
状态栏位于顶部,显示会话名与时间 |
| 窗口管理 | automatic-rename on、renumber-windows on |
自动重命名、关闭后自动重新编号 |
| 分屏 | 前缀 + |、前缀 + - |
水平、垂直分屏 |
| 窗格切换 | 前缀 + h/j/k/l |
类 vi 方向切换窗格 |
| 窗口切换 | Alt + 0~9 |
直接切换到指定编号窗口 |
| 拷贝模式 | 前缀 + y,v 选取,y 复制 |
vi 风格拷贝,通过 xclip 同步系统剪贴板 |
| 粘贴 | 前缀 + p |
从系统剪贴板粘贴 |
| 重载配置 | 前缀 + r |
重新加载 ~/.tmux.conf |
注意:使用
xclip相关功能需要系统已安装xclip,且在图形会话或正确配置了DISPLAY的环境下运行;部分较新版本 tmux(2.4+)已使用mouse统一选项替代mode-mouse等旧选项,bind-key -t vi-copy也改为bind-key -T copy-mode-vi,使用时可根据版本调整。
11.9 tmux 速查
| 任务 | 命令 |
|---|---|
| 新建会话 | tmux new -s name |
| 分离 | Ctrl + b d |
| 连接 | tmux attach -t name |
| 新建窗口 | Ctrl + b c |
| 竖分屏 | Ctrl + b + | |
| 横分屏 | Ctrl + b - |
十二、帮助文档与速查资源
12.1 帮助获取途径小结
| 途径 | 命令/位置 | 适用场景 |
|---|---|---|
| man 手册 | man 命令,文件位于 /usr/share/man |
查命令的完整选项说明(最常用) |
| info 文档 | info 命令,文件位于 /usr/share/info |
了解软件/概念的整体介绍 |
| 简要帮助 | 命令 --help、help 内置命令 |
快速回忆选项 |
| 命令定位 | type、which、whereis |
判断内部/外部命令与所在路径 |
| 软件自带文档 | /usr/share/doc/软件名/ |
查看示例配置文件与 README |
| 配置文件示例 | man 5 配置文件名 |
查配置文件的字段格式 |
12.2 Linux 常用基础命令大全(分类速查)
以下命令按用途分类整理,可作为日常运维的快速查阅清单。其中 <...> 表示需要根据实际情况替换的参数。
系统信息
| 命令 | 说明 |
|---|---|
uname -a |
查看内核 / 操作系统 / CPU 信息 |
head -n 1 /etc/issue |
查看操作系统版本 |
cat /proc/cpuinfo |
查看 CPU 信息 |
hostname |
查看计算机名 |
lspci -tv |
列出所有 PCI 设备 |
lsusb -tv |
列出所有 USB 设备 |
lsmod |
列出已加载的内核模块 |
env |
查看环境变量 |
资源与负载
| 命令 | 说明 |
|---|---|
free -m |
查看内存使用量和交换区使用量(以 MB 为单位) |
df -h |
查看各分区使用情况 |
du -sh <目录名> |
查看指定目录的大小 |
grep MemTotal /proc/meminfo |
查看内存总量 |
grep MemFree /proc/meminfo |
查看空闲内存量 |
uptime |
查看系统运行时间、用户数、负载 |
cat /proc/loadavg |
查看系统负载 |
磁盘和分区
详见 阶段03 磁盘与文件系统管理
| 命令 | 说明 |
|---|---|
mount \| column -t |
查看挂接的分区状态 |
fdisk -l |
查看所有分区 |
swapon -s |
查看所有交换分区 |
hdparm -i /dev/hda |
查看磁盘参数(仅适用于 IDE 设备) |
dmesg \| grep IDE |
查看启动时 IDE 设备检测状况 |
网络
详见 阶段07 网络基础与网络配置
| 命令 | 说明 |
|---|---|
ifconfig |
查看所有网络接口的属性(CentOS 7 推荐 ip a) |
iptables -L |
查看防火墙设置 |
route -n |
查看路由表 |
netstat -lntp |
查看所有监听端口 |
netstat -antp |
查看所有已经建立的连接 |
netstat -s |
查看网络统计信息 |
版本差异:CentOS 6 使用
net-tools(ifconfig、route、netstat)与iptables;CentOS 7 默认改用iproute2(ip a、ip route、ss -lntp)与firewalld,但仍可安装net-tools继续使用旧命令。
进程
详见 阶段04 进程与任务管理
| 命令 | 说明 |
|---|---|
ps -ef |
查看所有进程 |
top |
实时显示进程状态 |
用户
详见 阶段02 用户与权限管理
| 命令 | 说明 |
|---|---|
w |
查看活动用户 |
id <用户名> |
查看指定用户信息 |
last |
查看用户登录日志 |
cut -d: -f1 /etc/passwd |
查看系统所有用户 |
cut -d: -f1 /etc/group |
查看系统所有组 |
crontab -l |
查看当前用户的计划任务 |
服务
详见 阶段02 服务管理与 Shell 环境、阶段08 系统服务与日志管理
| 命令 | 说明 |
|---|---|
chkconfig --list |
列出所有系统服务(CentOS 6) |
chkconfig --list \| grep on |
列出所有开机启动的系统服务(CentOS 6) |
systemctl list-unit-files |
列出所有服务单元及开机状态(CentOS 7) |
软件包
详见 阶段05 软件包管理
| 命令 | 说明 |
|---|---|
rpm -qa |
查看所有已安装的软件包(RPM 系) |
12.3 图形界面与常用小工具
课程环境中还安装了若干图形/桌面工具,了解即可:
| 命令 | 说明 |
|---|---|
cal |
显示日历 |
mplayer / smplayer |
命令行/图形视频播放器 |
eog |
图片查看器 |
gedit |
图形界面文本编辑器 |
evince |
PDF 阅读器 |
openoffice |
办公软件 |
-
mplayer / smplayer 安装与测试:
sudo yum -y install epel-release sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm sudo yum makecache sudo yum search mplayer sudo yum install mplayer smplayer -y # 测试播放 cd /mnt/video mplayer 1_test.mp4 -
RealVNC:远程共享桌面。
详见 阶段07 网络配置与远程管理
-
共享端:
sudo yum install VNC-Server-6.3.1-Linux-x64.rpm sudo vnclicense -add 84WFN-YRJ4C-WA44V-9BW6X-PAE2A vncserver-x11 -
连接端:
sudo yum install VNC-Viewer-6.18.907-Linux-x64.rpm vncviewer
-
12.4 NFS 简单挂载(获取课堂素材)
详见 阶段09 基础网络服务部署(NFS 与 autofs)
课程中经常从教师机挂载共享目录:
# 查看 192.168.0.183 上有哪些共享目录
showmount -e 192.168.0.183
# 将 192.168.0.183 的 /soul 挂载到本机 /mnt
sudo mount 192.168.0.183:/soul /mnt
# 切换到挂载点使用
cd /mnt
ls
cd linux/2_linuxBasics
ls
vi 2_detail.txt
使用完毕后卸载:
cd / # 必须先退出挂载目录,否则设备忙
sudo umount /mnt # 取消挂载
sudo umount /mnt -l # 强制延迟卸载(lazy umount)
卸载前先
cd /离开挂载点,否则会提示device is busy而无法卸载。
12.5 vim 编辑器
vi 是经典文本编辑器,vim 是其增强版(Vi IMproved),现在各版本 Linux 基本都带有 vim。
sudo yum install vim -y
| 任务 | 命令 |
|---|---|
| 保存退出 | :wq |
| 强制退出 | :q! |
| 撤销 | u |
| 复制一行 | yy |
| 删除一行 | dd |
| 粘贴 | p |
| 跳转到行尾 | $ |
| 跳转到文件首 | gg |
| 全文替换 | :%s/old/new/g |
vim 的三种模式、光标定位、可视模式、查找替换、多窗口/多标签、缓冲区、折叠、配置文件(
/etc/vimrc、~/.vimrc)等完整内容详见 01-03-vim编辑器.md。
12.6 附:CentOS 7 源码安装 Python3.7.3
本节属于软件包管理范畴,完整的源码编译安装流程与依赖处理详见 阶段05 软件包管理
安装环境
- 操作系统:CentOS Linux release 7.6.1810 (Core)
- Python 官网:https://www.python.org/
1. 下载源码包
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
2. 解压并进入源码目录
tar -xvf Python-3.7.3.tgz -C /usr/src
cd /usr/src/Python-3.7.3/
ls
解压后目录中应包含 configure、Makefile.pre.in、setup.py 等文件,例如:
aclocal.m4 config.guess configure Doc Include Lib m4 Makefile.pre.in Modules Parser PCbuild pyconfig.h.in README.rst Tools
CODE_OF_CONDUCT.rst config.sub configure.ac Grammar install-sh LICENSE Mac Misc Objects PC Programs Python setup.py
3. 安装编译依赖
yum install -y gcc gcc-c++ zlib zlib-devel pcre pcre-devel openssl openssl-devel libffi-devel
4. 配置编译参数
--prefix 指定安装路径,--enable-optimizations 启用 PGO 等优化选项:
./configure --prefix=/usr/local/python3 --enable-optimizations
5. 编译并安装
make
make install
6. 设置软链接
为避免影响系统自带的 Python2,先将原 /usr/bin/python 改名,再创建指向 Python3.7 的软链接:
mv /usr/bin/python /usr/bin/python2.7.5
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python
7. 修复 yum 解释器
由于 CentOS 7 的 yum 依赖系统默认的 Python2,在修改软链接后需要显式指定其使用原来的 Python2.7.5,否则 yum 将无法运行:
vim /usr/bin/yum
将文件首行:
#!/usr/bin/python
修改为:
#!/usr/bin/python2.7.5
保存退出即可。
十三、课堂练习与作业
以下练习用于巩固本章命令,建议在独立的练习目录(如 ~/practice)下完成。
练习 1:目录树创建
-
在练习目录下创建一个
test文件夹,并在test内创建 100 个文件夹。mkdir test cd test mkdir file{1..100} -
在
test下使用mkdir -p一次性创建如下目录树:
test
└── a
├── b
│ ├── c
│ │ ├── d
│ │ │ ├── c
│ │ │ ├── e
│ │ │ ├── v
│ │ │ ├── x
│ │ │ └── z
│ │ ├── h
│ │ ├── i
│ │ └── j
│ └── g
└── f
参考答案(一条命令完成):
mkdir -p test/a/b/c/d/{c,e,v,x,z} test/a/b/c/{h,i,j} test/a/b/g test/a/f
练习 2:软链接
- 使用
vim创建一个普通文件test.txt,内容为hello world。 - 创建一个软链接指向
test.txt。 - 通过软链接修改文件内容,验证源文件同步变化。
参考答案:
vim test.txt # 输入 hello world 后 :wq 保存
ln -s test.txt test_link # 为 test.txt 创建软链接
vim test_link # 通过软链接修改
cat test.txt # 验证源文件内容已同步变化
练习 3:ls 与文件复制/剪切
-
分别执行并熟悉以下命令的区别:
ls -al # 含隐藏文件的详细列表 ls -lt # 按修改时间排序 ls -lh # 人类可读大小 ls -dl # 只看目录本身(等价于 ls -ld) -
把目录
d下的所有内容复制到b,要求显示复制进度。cp -rv d/* b/ -
把目录
d下的所有内容剪切到b。mv d/* b/
练习 4:rename 批量重命名
创建以下文件:
1.conf.conf.conf.conf 2_conf.conf 3_conf.txt 4.conftest.conf.conf
touch 1.conf.conf.conf.conf 2_conf.conf 3_conf.txt 4.conftest.conf.conf
在当前目录多次执行:
rename .conf .html *.conf
观察每次执行后文件名的变化,理解 rename 每次只替换文件名中第一个匹配串的规则(3_conf.txt 因不匹配 *.conf 而始终不变)。
练习 5:文件阅读命令
-
cat:cat /etc/passwd > 1_passwd.txt cat -n 1_passwd.txt cat -b 1_passwd.txt cat -s 1_passwd.txt -
head:查看/etc/passwd的前 10 行、前 10 个字符、整个文件(思考如何实现)。head /etc/passwd # 前 10 行 head -c 10 /etc/passwd # 前 10 个字符 head -n -0 /etc/passwd # 整个文件;也可直接用 cat -
tail:查看后 10 行、后 10 个字符、整个文件,并尝试-f实时跟踪。tail /etc/passwd tail -c 10 /etc/passwd tail -n +1 /etc/passwd # 从第 1 行开始即整个文件 tail -f /etc/passwd -
less:使用-N显示行号、-m显示百分比。less -N /etc/passwd less -m /etc/passwd
练习 6:重定向
-
用
cat配合输出重定向,把/etc/passwd写入新文件。cat /etc/passwd > new_passwd.txt -
用
cat查看一个不存在的文件,将错误输出重定向到文件。cat nofile 2> error.txt -
用
cat查看一个不存在的文件,将错误输出丢弃到/dev/null。cat nofile 2> /dev/null -
把
/etc/passwd作为cat的输入源,将结果输出到新文件。cat < /etc/passwd > new_passwd2.txt
练习 7:管道综合练习
-
输出
/etc/passwd的第 10 行到第 20 行,并且带行号。sed -n '10,20p' /etc/passwd | cat -n # 或:head -20 /etc/passwd | tail -11 | cat -n -
把
cat的输入重定向到终端手动输入内容,再将cat的输出重定向到文件。cat > out.txt # 手动输入内容,Ctrl+D 结束 cat << EOF > out.txt hello EOF -
用
cat代替echo完成打印输出,并将结果导入新文件。cat <<< "hello world" > hello.txt -
在不打开、不删除、不创建同名文件的前提下清空一个普通文件(提示:使用重定向)。
> file
练习 8:综合练习(目录、链接、别名)
-
在根目录下创建
aaa和bbb两个目录。mkdir /aaa /bbb -
进入
aaa,再创建ddd子目录。cd /aaa && mkdir ddd -
在
ddd中创建一个以自己名字拼音命名的普通文件。touch /aaa/ddd/zhangsan -
用
echo向该文件追加内容,格式为*.*.*.*(数字或字母)。echo "a.1.b.2" >> /aaa/ddd/zhangsan -
用
ln为该文件在bbb目录分别创建硬链接和软链接。ln /aaa/ddd/zhangsan /bbb/zhangsan_hard ln -s /aaa/ddd/zhangsan /bbb/zhangsan_soft -
为
clear创建别名(别名为自己名字拼音,需带选项),先检查是否被占用,再写入~/.bashrc永久生效。zhangsan # 提示 command not found 说明可用 echo "alias zhangsan='clear'" >> ~/.bashrc source ~/.bashrc -
用
which查询自己定义的别名属于哪个命令。which zhangsan -
用一条命令创建三个以数字命名的目录。
mkdir 1 2 3 # 或:mkdir {1..3} -
创建以数字 1-9 开头、
.txt结尾的文件。touch {1..9}.txt -
用
rename将所有.txt文件改名为.php。rename .txt .php *.txt
课后作业
-
多次练习练习 1 ~ 4,熟练掌握目录/文件操作。
-
多练习
cd的绝对路径、相对路径以及父目录切换。 -
尝试用一条命令把多个文件夹复制到另一个位置。
cp -r dir1 dir2 dir3 /target/ # 或 cp -rt /target/ dir1 dir2 dir3 -
用一条命令完成练习 1 的目录树创建。
-
复习本章所有命令,以及 vim(详见 01-03-vim编辑器.md)与 tmux 快捷键。
此处评论已关闭