Linux - 2 系统操作篇(ls、mkdir、touch、cp、rm、mv、cat、less、echo、tail)
工具下载
工具:MobaXterm_Portable
| 中文版 | https://github.com/RipplePiam/MobaXterm-Chinese-Simplified |
|---|---|
| 中文版MobaXterm_Portable_v24.3_chs.zip | 链接: https://pan.baidu.com/s/15ivfyXj5Wua43CVyjjz7_A?pwd=1234 提取码: 1234 --来自百度网盘超级会员v8的分享 |
| MobaXterm_Portable_v25.2.zip | 链接: https://pan.baidu.com/s/11aNEd0Oi12Mi_iuN5Mcx3g?pwd=1234 提取码: 1234 |
1)认识基础目录

一、常用目录(管理员和普通用户高频操作)
| 目录 | 作用说明 |
|---|---|
| /home | 普通用户的家目录,每个用户在此有独立子目录(如 /home/user1),用于存储个人文件、配置等。 |
| /tmp | 临时文件目录,系统或程序产生的临时文件存放于此,重启后会清空,也可手动清理。 |
| /etc | 系统核心配置文件目录,如网络、服务、用户等配置都在这(如 /etc/passwd 是用户信息文件)。 |
| /usr | 系统 “用户程序” 目录,类似 Windows 的 Program Files,包含应用程序、库文件、文档等(/usr/bin 是用户命令,/usr/lib 是库文件)。 |
| /var | 可变数据目录,存储日志(/var/log)、邮件(/var/mail)、数据库文件等动态变化的内容。 |
| /opt | 第三方软件安装目录(如手动安装的 Java、Python 等,方便集中管理)。 |
| /root | 管理员(root 用户)的家目录,存储 root 用户的个人文件和配置。 |
二、不常用 / 系统级目录(主要由系统维护,用户一般无需直接操作)
| 目录 | 作用说明 |
|---|---|
| /bin | 系统核心命令目录(如 ls、cp 等基础命令),普通用户即可执行,是系统启动必需的命令集合。 |
| /sbin | 系统管理命令目录(如 ifconfig、reboot 等),需管理员权限执行,用于系统级操作。 |
| /boot | 系统启动目录,存放内核、启动加载器(如 grub)等启动必需文件。 |
| /dev | 设备文件目录,Linux 中硬件设备以文件形式呈现(如 /dev/sda 是硬盘,/dev/tty 是终端)。 |
| /lib | 系统库文件目录,存放 bin 和 sbin 命令依赖的共享库(/lib64 是 64 位库的专属目录)。 |
| /media | 可移动设备挂载点(如插入 U 盘后,系统会自动挂载到 /media/xxx)。 |
| /mnt | 临时挂载目录,管理员可手动挂载磁盘、分区到这里(如挂载光驱到 /mnt/cdrom)。 |
| /proc | 虚拟文件系统,存储系统运行时的内核、进程信息(如 /proc/cpuinfo 是 CPU 信息,/proc/meminfo 是内存信息)。 |
| /run | 系统运行时临时文件目录,存储进程 PID、socket 等运行时数据,重启后清空。 |
| /srv | 服务数据目录,如 Web 服务(/srv/www)、FTP 服务的共享数据可存于此(实际使用中较少直接操作)。 |
| /sys | 与 /proc 类似的虚拟文件系统,用于访问硬件设备的驱动信息和系统参数(主要供系统工具调用)。 |
2)帮助命令

-
Man工具可以显示系统手册页中的内容,这些内容大多数都是对命令的解释信息。通过查看系统文档中的man页可以得到程序的更多相关主题信息和Linux的更多特性。man是非常实用的一种工具,当你在使用到某一个并不熟悉的命令时,man命令会显得非常有用。
- 当需要了解某个工具更为详细的信息时,可以使用命令man后跟工具名的方法来实现。

- 当需要了解某个工具更为详细的信息时,可以使用命令man后跟工具名的方法来实现。
-
“--help”是一个工具选项,大部分的GNU工具都具备这个选项,“--help”选项可以用来显示一些工具的信息
-
Info工具是一个基于菜单的超文本系统,由GNU项目开发并由Linux发布。info工具包括一些关于Linux shell、工具、GNU项目开发程序的说明文档。
3)目录操作(创建、切换、查看)
| 命令 | 功能说明 | 常用示例 |
|---|---|---|
| ls | 列出当前目录内容 | ls |
| ls -l | 详细列出目录内容(含权限、大小、时间) | ls -l /home |
| ls -a | 显示所有文件(含隐藏文件,以。开头) | ls -a ~ |
| cd | 切换目录 | cd /usr/local |
| cd ~ | 回到当前用户家目录 | cd ~ |
| cd - | 切换上次的路径(2个路径来回跳转) | |
| cd .. | 回到上一级目录 | cd ../docs |
| pwd | 显示当前工作目录绝对路径 | pwd |
| mkdir | 创建单个目录 | mkdir test |
| mkdir -p dir1/dir2 | 递归创建多级目录(父目录不存在则自动创建) | mkdir -p project/src |
| rmdir | 删除文件夹 | rmdir doc |
| rmdir -p a/b/c | 递归删除多级目录 | rmdir -p a/b/c |
(3.1) ls 列出目录内容
ls 的参数可组合使用(如 ls -lha),以下是高频参数说明:

| 参数 | 英文含义 | 功能描述 |
|---|---|---|
| -l | long format | 长格式显示(权限、所有者、大小、修改时间、名称,最常用) |
| -a | all | 显示所有文件 / 目录(包括隐藏文件 .xxx 和当前目录 .、上级目录 ..) |
| -h | human-readable | 以人类易读的单位显示文件大小(KB/MB/GB,需配合 -l 使用) |
-t |
time-sorted | 按修改时间排序(最新修改的在前) |
-r |
reverse | 反向排序(配合 -t 时实现 “最新在后”,配合默认排序时倒序字母) |
-F |
classify | 给不同类型文件加后缀标识(目录 /、可执行文件 *、链接文件 @ 等) |
-i |
inode | 显示文件的 inode 编号(文件系统中唯一标识) |
-d |
directory | 仅显示目录本身的信息(而非目录内内容,常用于查看目录属性:ls -ld 目录名) |
-R |
recursive | 递归列出子目录的内容(遍历所有层级子目录) |
高频示例(实战常用)
1. 长格式查看(最常用:ls -l)
显示文件 / 目录的详细属性(权限、所有者、大小、修改时间):
ls -l
# 示例输出(字段含义从左到右)
-rw-r--r-- 1 user staff 1.2K 5月 20 14:30 README.txt # 文件
drwxr-xr-x 3 user staff 96B 6月 1 09:15 Documents # 目录(d开头)
lrwxr-xr-x 1 user staff 8B 4月 10 16:20 link.txt -> file.txt # 链接文件(l开头)
- 第一字符:文件类型(
-普通文件、d目录、l链接、c字符设备、b块设备) - 接下来 9 字符:权限(所有者 rwx、组用户 rwx、其他用户 rwx,
-表示无权限) - 数字:硬链接数
user/staff:所有者 / 所属组- 大小:默认字节(配合
-h显示 KB/MB) - 时间:最后修改时间
- 名称:文件 / 目录名(链接文件会显示指向目标)
2. 查看所有文件(包括隐藏文件:ls -a)
ls -a
# 示例输出(包含 .bashrc、.git 等隐藏文件)
. .. .bashrc .git Documents photo.jpg README.txt
.表示当前目录,..表示上级目录
3. 易读大小 + 长格式(ls -lh)
文件大小以 KB/MB/GB 显示,更直观:
ls -lh
# 示例输出
-rw-r--r-- 1 user staff 1.2K 5月 20 14:30 README.txt
drwxr-xr-x 3 user staff 96B 6月 1 09:15 Documents
-rw-r--r-- 1 user staff 2.5M 7月 5 16:40 video.mp4
4. 按修改时间排序(ls -lt)
最新修改的文件 / 目录排在前面,配合 -lh 更实用:
ls -lht # 易读大小+长格式+按时间排序
5. 查看目录本身属性(ls -ld)
默认 ls -l 目录名 会显示目录内内容,-d 仅显示目录自身属性:
ls -ld Documents
# 示例输出(Documents 目录的权限、大小等)
drwxr-xr-x 3 user staff 96B 6月 1 09:15 Documents
6. 递归查看子目录(ls -R)
遍历当前目录下所有层级的子目录,列出所有文件:
ls -R
# 示例输出(会显示子目录内的文件)
./Documents:
report.pdf notes.txt
./Music:
song1.mp3 song2.flac
photo.jpg README.txt
7. 给文件类型加标识(ls -F)
快速区分文件 / 目录 / 可执行文件:
ls -F
# 示例输出(目录加 /,可执行文件加 *,链接加 @)
Documents/ Music/ photo.jpg README.txt run.sh* link.txt@
进阶用法
1. 查看指定目录的内容
格式:ls [参数] 目录路径(绝对路径或相对路径)
ls -lh /home/user/Documents # 绝对路径
ls -a ../Work # 相对路径(上级目录的 Work 文件夹)
2. 过滤显示特定文件(通配符)
用 *(匹配任意字符)、?(匹配单个字符)过滤:
ls *.txt # 列出所有 .txt 后缀的文件
ls photo.?pg # 匹配 photo.jpg 或 photo.png(? 匹配单个字符)
ls file[1-3].log # 匹配 file1.log、file2.log、file3.log
3. 按大小排序(ls -lS)
大写 S 按文件大小降序排序(配合 -h 更易读):
ls -lhS # 从大到小排列文件
ls -lhSr # 从小到大排列(加 -r 反向)
(3.2) ls -l 核心:10 位属性字符串拆解
格式:[文件类型][所有者权限][所属组权限][其他用户权限][特殊标记]
(第 10 位 . 是 SELinux 安全上下文标记,默认可忽略)

以 dr-xr-x---. 为例,逐位解释:
-
第 1 位:文件类型
d:目录(directory),如.、..、.pki-:普通文件(file),如anaconda-ks.cfg、default.confl:符号链接(link)(当前输出中没有)b:块设备文件(如硬盘)c:字符设备文件(如键盘)
-
第 2-4 位:所有者权限(u)
所有者对该文件 / 目录的操作权限,3 位分别对应
读(r)、写(w)、执行(x):-
示例
r-x:所有者拥有「读(r=4)+ 执行(x=1)」权限,无写权限(-表示无此权限) -
常见组合:
rwx(完全控制)、rw-(读 + 写,无执行)、r--(仅读)
-
-
第 5-7 位:所属组权限(g)
同组用户的操作权限,格式和含义和「所有者权限」一致:
- 示例
r-x:所属组用户拥有「读 + 执行」权限,无写权限
- 示例
-
第 8-10 位:其他用户权限(o)
系统中除所有者、所属组外的其他用户的权限,格式同上:
- 示例
---:其他用户无任何权限(读、写、执行都禁止)
- 示例
一、基础权限对应关系
| 权限类型 | 字母标识 | 数字值 | 作用(文件 / 目录) |
|---|---|---|---|
| 读权限 | r | 4 | 文件:可查看内容;目录:可列出内容(ls) |
| 写权限 | w | 2 | 文件:可修改 / 删除内容;目录:可创建 / 删除内部文件 / 目录 |
| 执行权限 | x | 1 | 文件:可运行(如脚本);目录:可进入(cd) |
| 无权限 | - | 0 | 无任何操作权限 |
二、常用权限组合对照表(高频场景)
| 数字权限 | 权限字符串(u-g-o) | 适用对象 | 核心说明 |
|---|---|---|---|
| 755 | rwxr-xr-x | 可执行脚本、公共目录 | 所有者全权限(rwx=4+2+1),同组 / 其他用户仅读 + 执行(r-x=4+1),安全且通用 |
| 644 | rw-r--r-- | 普通文件、配置文件 | 所有者读 + 写(rw-=4+2),同组 / 其他用户仅读(r--=4),最常用的文件权限 |
| 700 | rwx------ | 私有目录、敏感文件 | 仅所有者有全权限,同组 / 其他无任何权限,保护隐私(如 .ssh 目录) |
| 600 | rw------- | 敏感配置文件 | 仅所有者读 + 写,其他无权限(如密码文件、.bash_history) |
| 777 | rwxrwxrwx | 临时共享目录 / 文件 | 所有用户全权限,安全性极低,仅临时使用(慎用!) |
| 750 | rwxr-x--- | root 私有目录 | 所有者全权限,同组读 + 执行,其他无权限(如你当前的 /root 目录) |
| 640 | rw-r----- | 组内共享配置文件 | 所有者读 + 写,同组仅读,其他无权限 |
三、快速换算技巧
-
数字权限 = 3 组数字拼接(如 755 = 所有者 7 + 所属组 5 + 其他用户 5)
-
单组数字计算:r=4、w=2、x=1,按需求和
例:r-x=4+0+1=5,rw-=4+2+0=6,rwx=4+2+1=7
-
反向推导:已知数字权限,快速写字符串
例:644 → 所有者 6(rw-)+ 所属组 4(r--)+ 其他 4(r--)→ rw-r--r--
(3.3) mkdir(创建目录)
mkdir (make directories) 核心功能是创建目录,以下是常用参数、场景示例和实用技巧,直接复制可用。
一、基础用法(日常高频)
1. 创建单个目录
- 命令:
mkdir docs功能:在当前目录下创建名为docs的目录。
2. 递归创建多级目录(最实用)
- 命令:
mkdir -p a/b/c功能:一次性创建a、a/b、a/b/c三级嵌套目录,父目录不存在时自动创建(无需手动逐层创建)。
二、常用参数详解
| 参数 | 作用 | 示例 |
|---|---|---|
| -p | 递归创建多级目录(父目录不存在则自动创建) | mkdir -p a/b/c(创建 a 及子目录 b、c) |
-m |
创建目录时直接指定权限(无需后续 chmod) | mkdir -m 755 public_dir(创建目录并设权限 755) |
-v |
显示创建过程( verbose,适合批量创建时确认) | mkdir -pv test/dir(输出“已创建目录 test”“已创建目录 test/dir”) |
三、实用场景示例
1. 项目目录快速搭建
- 命令:
mkdir -pv project/{src,docs,logs,conf}功能:在project目录下,同时创建src(源码)、docs(文档)、logs(日志)、conf(配置)4 个子目录,高效搭建项目结构。
2. 创建带指定权限的私有目录
- 命令:
mkdir -m 700 private_data功能:创建private_data目录,同时设置权限 700(仅所有者可读写执行,其他人无权限),无需再执行chmod。
3. 批量创建有序目录
- 命令:
mkdir -p data/{202401..202412}功能:创建data目录,并在其下批量创建 202401 到 202412 共 12 个按月份命名的子目录(适合按时间分类存储数据)。
4)文件 / 目录操作(复制、移动、删除、创建)
| 命令 | 语法 | 功能说明 | 常用示例 |
|---|---|---|---|
| touch | 创建空文件或更新文件时间戳 | touch newfile.txt、touch -d "2024-01-01" oldfile.txt | |
| cp | cp [OPTION]... 源文件/目录... 目标文件/目录 | 复制文件 | cp file1.txt /tmp |
| cp -r | 递归复制目录及所有内容 | cp -r docs /home/user | |
| rm | 删除文件或空目录 | rm file.txt | |
| rm -r | 递归删除目录及所有内容 | rm -r testdir | |
| rm -f | 强制删除(不提示确认,慎用) | rm -f old.log | |
| mv | 移动文件 / 目录,或重命名 | mv file.txt new.txt(重命名)、mv file.txt/tmp(移动) |
(4.1)touch 创建文件 / 更新文件时间
Linux touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
语法
touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]
- 参数说明:
- a 改变档案的读取时间记录。
- m 改变档案的修改时间记录。
- c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
- f 不使用,是为了与其他 unix 系统的相容性而保留。
- r 使用参考档的时间记录,与 --file 的效果一样。
- d 设定时间与日期,可以使用各种不同的格式。
- t 设定档案的时间记录,格式与 date 指令相同。
实例
使用指令"touch"修改文件"testfile"的时间属性为当前系统时间,输入如下命令:
$ touch testfile #修改文件的时间属性
首先,使用ls命令查看testfile文件的属性,如下所示:
$ ls -l testfile #查看文件的时间属性
#原来文件的修改时间为16:09
-rw-r--r-- 1 hdd hdd 55 2011-08-22 16:09 testfile
执行指令"touch"修改文件属性以后,并再次查看该文件的时间属性,如下所示:
$ touch testfile #修改文件时间属性为当前系统时间
$ ls -l testfile #查看文件的时间属性
#修改后文件的时间属性为当前系统时间
-rw-r--r-- 1 hdd hdd 55 2011-08-22 19:53 testfile
使用指令"touch"时,如果指定的文件不存在,则将创建一个新的空白文件。例如,在当前目录下,使用该指令创建一个空白文件"file",输入如下命令:
$ touch file #创建一个名为“file”的新的空白文件
(4.2)cp (复制文件/目录)
cp(英文全称 copy)是 Linux 中最常用的文件/目录复制命令,核心功能是将源文件/目录复制到目标位置,支持权限保留、递归复制、强制覆盖等实用功能,以下是详细用法:
| 需求 | 命令 |
|---|---|
| 备份目录(保留所有属性) | cp -a src_dir/ backup_dir/ |
| 强制覆盖单个文件 | cp -f src_file dest_file |
| 增量复制目录 | cp -ur src_dir/ dest_dir/ |
| 复制文件并显示过程 | cp -v src_file dest_dir/ |
| 创建软链接 | cp -s src_file link_name |
![]() |
一、核心语法
cp [OPTION]... 源文件/目录... 目标文件/目录
-
关键说明:
-
若目标是文件:只能复制单个源文件,会覆盖目标文件(或创建新文件)
-
若目标是目录:可复制多个源文件/目录,全部放入该目标目录
-
若复制目录:必须加
-r/-R参数(递归复制),否则报错
-
二、常用参数(重点必记)
| 参数 | 英文全称 | 功能说明 |
|---|---|---|
| -r | recursive | 递归复制目录(含子目录和所有内容),复制目录时必填 |
| -f | force | 强制覆盖目标文件/目录(无需确认,忽略不存在的源文件) |
-i |
interactive | 交互式复制(覆盖前提示确认,默认行为,可手动关闭) |
-p |
preserve | 保留源文件的属性(权限、所有者、所属组、修改时间) |
-a |
archive | 归档复制(等价于 -dR --preserve=all),保留所有属性+递归复制,适合备份 |
| -v | verbose | 显示复制过程(输出每个文件的复制详情,方便确认) |
-u |
update | 仅复制“源文件比目标新”或“目标不存在”的文件(避免重复复制) |
-l |
link | 不复制文件内容,仅创建硬链接(而非物理副本,节省空间) |
-s |
symbolic | 创建符号链接(软链接),而非实际复制文件/目录 |
三、基础用法(日常高频场景)
1. 复制单个文件到指定位置
-
示例 1:复制文件到目标目录(保留原文件名)
cp document.txt /home/user/docs/功能:将当前目录的
document.txt复制到/home/user/docs/目录下,文件名不变。 -
示例 2:复制文件并修改文件名
cp report.pdf /tmp/report_2025.pdf功能:将
report.pdf复制到/tmp目录,并改名为report_2025.pdf。
2. 复制多个文件到同一目录
cp file1.txt photo.jpg data.csv /media/usb/
功能:同时复制 file1.txt、photo.jpg、data.csv 三个文件到 /media/usb/ 目录。
3. 复制目录(核心场景)
-
示例 1:递归复制目录(基础用法)
cp -r project/ backup/功能:将
project目录及其所有子目录、文件,完整复制到backup目录(backup不存在则创建,存在则放入内部)。 -
示例 2:复制目录并保留属性(备份常用)
cp -a project/ /data/backup/project_2025/功能:归档复制
project目录到/data/backup/下,保留原文件的权限、所有者、修改时间等所有属性,适合重要数据备份。
四、高级实用场景
1. 强制覆盖文件(无需确认)
默认情况下 cp 覆盖文件会提示(cp: 是否覆盖XXX?),加 -f 跳过确认:
cp -f config.txt /etc/config.txt
适合脚本自动化执行时使用(避免交互卡住)。
2. 仅更新较新的文件(增量复制)
cp -ur /home/user/docs/ /data/backup/docs/
功能:仅复制 /home/user/docs/ 中比 /data/backup/docs/ 更新的文件,或目标中不存在的文件,节省时间(适合增量备份)。
3. 复制时显示进度
cp -v large_file.iso /media/usb/
输出示例:'large_file.iso' -> '/media/usb/large_file.iso',清晰看到复制状态。
4. 创建符号链接(而非实际复制)
cp -s /usr/bin/python3 /usr/bin/python
功能:不在 /usr/bin/ 复制 python3 二进制文件,仅创建一个软链接 python 指向它(相当于“快捷方式”),节省磁盘空间。
5. 复制隐藏文件(含目录内隐藏文件)
cp -a /home/user/.config/ /backup/
-a 参数会保留隐藏文件(如 .bashrc、.vimrc)和目录结构,直接复制所有内容。
五、常见误区与注意事项
-
复制目录必须加
-r/-a:直接执行cp dir1 dir2会报错cp: 略过目录'dir1',必须加-r。 -
区分软链接和硬链接:
-
-s软链接:删除源文件后,链接失效(红底白字闪烁) -
-l硬链接:删除源文件后,链接仍可用(共享同一个 inode)
-
-
覆盖风险:
cp -f会直接覆盖目标文件,无恢复可能,操作系统文件(如/etc/下的文件)时务必谨慎。 -
大文件复制:复制超大文件(如几十GB)时,可搭配
pv命令查看实时进度(需先安装yum install pv):pv large_file.img | cp -t /media/usb/
(4.3)rm 删除文件或目录
Linux rm(英文全拼:remove)命令用于删除一个文件或者目录。
语法
rm [options] name...
参数:
- -i 删除前逐一询问确认。
- -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
- -r 将目录及以下之档案亦逐一删除。
实例
删除文件可以直接使用rm命令,若删除目录则必须配合选项"-r",例如:
# rm test.txt
rm:是否删除 一般文件 "test.txt"? y
# rm homework
rm: 无法删除目录"homework": 是一个目录
# rm -r homework
rm:是否删除 目录 "homework"? y
删除当前目录下的所有文件及目录,命令行为:
rm -r *
文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令。
(4.4)mv (移动/重命名文件/目录)
mv(英文全称 move)是 Linux 中核心的文件/目录操作命令,核心功能是「移动文件/目录到指定位置」或「重命名文件/目录」,操作本质是修改文件系统的路径引用,无需复制文件内容(比 cp 更高效),以下是详细用法:
| 需求 | 命令 |
|---|---|
| 重命名文件 | mv old.txt new.txt |
| 移动目录到目标位置 | mv dir1 /home/user/ |
| 移动并重命名 | mv src/file.txt dest/new_file.txt |
| 强制覆盖无提示 | mv -f src dest |
| 安全移动(不覆盖) | mv -n src dest |
| 显示移动过程 | mv -v src dest |
| 批量移动 .log 文件 | mv *.log logs/ |
一、核心语法
mv [OPTION]... 源文件/目录... 目标文件/目录
-
关键逻辑:
-
若目标是文件:仅能移动单个源文件,会覆盖目标文件(或重命名源文件为目标文件名)
-
若目标是目录:可移动多个源文件/目录,全部放入该目标目录
-
若源和目标在同一目录:本质是「重命名」;若在不同目录:本质是「移动」(可同时重命名)
-
二、常用参数(重点必记)
| 参数 | 英文全称 | 功能说明 |
|---|---|---|
-f |
force | 强制移动/覆盖(无需确认,忽略不存在的源文件, suppress 警告) |
-i |
interactive | 交互式操作(覆盖前提示确认,默认行为,避免误删) |
-v |
verbose | 显示操作过程(输出移动/重命名的详细日志,方便确认) |
-n |
no clobber | 不覆盖已存在的目标文件(比 -i 更安全,避免误覆盖) |
-u |
update | 仅当源文件比目标文件新,或目标文件不存在时才移动 |
三、基础用法(日常高频场景)
1. 重命名文件/目录(同一目录下)
-
示例 1:重命名文件
mv report.txt report_2025.txt功能:将当前目录的
report.txt重命名为report_2025.txt(同一目录,仅改文件名)。 -
示例 2:重命名目录
mv project/ project_v2/功能:将
project目录重命名为project_v2,目录内所有内容不变(无需加-r,mv对目录默认支持递归移动)。
2. 移动文件/目录到指定位置
-
示例 1:移动单个文件到目标目录
mv photo.jpg /home/user/Pictures/功能:将当前目录的
photo.jpg移动到/home/user/Pictures/目录,文件名不变。 -
示例 2:移动多个文件到同一目录
mv file1.txt data.csv docs/功能:同时将
file1.txt、data.csv两个文件移动到docs/目录下。 -
示例 3:移动目录到目标位置
mv /tmp/project/ /home/user/workspace/功能:将
/tmp/project/目录(含所有子内容)移动到/home/user/workspace/目录下,无需加-r(mv处理目录无需递归参数)。
3. 移动并同时重命名
mv /var/log/nginx/access.log /backup/logs/nginx_access_202511.log
功能:将 /var/log/nginx/access.log 文件移动到 /backup/logs/ 目录,并改名为 nginx_access_202511.log(移动+重命名一步完成)。
四、高级实用场景
1. 强制覆盖文件(无提示)
默认情况下,mv 覆盖文件会提示(mv: 是否覆盖'XXX'?),加 -f 跳过确认,适合脚本自动化:
mv -f new_config.conf /etc/config.conf
- 注意:覆盖后原目标文件不可恢复,修改系统配置文件时务必谨慎。
2. 安全移动(不覆盖已有文件)
用 -n 参数避免误覆盖,若目标文件已存在,直接跳过操作(无提示):
mv -n important.txt /home/user/backup/
- 优势:比
-i更省心,无需手动确认,适合批量移动时保护目标文件。
3. 仅移动更新的文件(增量移动)
mv -u /home/user/downloads/*.zip /media/usb/
功能:仅移动 /home/user/downloads/ 中比 /media/usb/ 目录下更新的 .zip 文件,或目标中不存在的文件,避免重复移动。
4. 显示移动过程(确认操作)
mv -v docs/* /home/user/docs/
输出示例:'docs/file1.txt' -> '/home/user/docs/file1.txt',清晰看到每个文件的移动路径,适合批量操作时验证。
5. 移动隐藏文件(含目录内隐藏文件)
mv -v /home/user/.config/ /backup/
mv 默认会移动隐藏文件(如 .bashrc、.vimrc),加 -v 可确认隐藏文件是否被正确移动。
6. 批量移动特定类型文件
结合通配符 * 筛选文件类型,高效批量移动:
移动当前目录下所有 .log 文件到 logs/ 目录
mv *.log logs/
递归移动所有子目录下的 .txt 文件到 docs/ 目录
mv */*.txt docs/
五、常见误区与注意事项
-
移动目录无需加
-r:与cp不同,mv处理目录时不需要-r参数,直接写目录路径即可(mv dir1 dir2合法)。 -
跨文件系统移动的差异:
-
同一文件系统(如同一硬盘分区):
mv仅修改路径引用,速度极快(无文件复制); -
不同文件系统(如本地硬盘 → U 盘):
mv会先复制文件到目标位置,再删除源文件,速度取决于文件大小。
-
-
权限要求:
-
执行用户需具备:① 源文件/目录的“读+执行权限”(能访问和移动);② 目标目录的“写+执行权限”(能创建文件/目录)。
-
权限不足报错:
mv: 无法创建普通文件'XXX': 权限不够,解决方案:sudo mv 源 目标。
-
-
避免循环移动:不要将目录移动到自身子目录,会报错或导致目录结构异常,例如:
mv docs/ docs/subdir/ # 错误:将 docs 移动到自己的子目录 subdir -
符号链接的移动规则:
-
移动符号链接本身:
mv link.txt /tmp/→ 仅移动链接文件,不影响链接指向的源文件; -
移动符号链接指向的源文件:若源文件路径改变,符号链接会失效(需重新创建链接)。
-
六、常见报错与解决方案
1. 报错:mv: 无法将'dir1' 移动至'dir2/dir1': 目录非空
-
原因:目标目录
dir2/dir1已存在且非空,mv不允许覆盖非空目录。 -
解决方案:
-
先删除目标非空目录(慎用):
rm -rf dir2/dir1 && mv dir1 dir2/; -
或重命名源目录:
mv dir1 dir2/dir1_new。
-
2. 报错:mv: 无法 stat 'XXX': 没有那个文件或目录
-
原因:源文件/目录路径错误(拼写错误、路径不存在)。
-
解决方案:用
ls验证源路径,如ls /path/to/src,确认路径正确后再执行。
3. 报错:mv: 覆盖'XXX'?(无限循环提示)
-
原因:系统 alias 设置
mv='mv -i'(默认交互式)。 -
解决方案:
-
加
-f强制覆盖:mv -f src dest; -
临时取消 alias:
\mv src dest(反斜杠忽略别名)。
-
5)文件内容查看(读取、分页、监控)
| 命令 | 功能说明 | 常用示例 |
|---|---|---|
| cat | 一次性显示文件全部内容(适合小文件) | cat config.conf |
| more | 分页查看文件(仅向下翻页,按空格翻页) | more large.log |
| less | 分页查看文件(支持上下滚动,按 q 退出) | less access.log |
| head | 查看文件开头内容(默认前 10 行) | head -5 data.csv(前 5 行) |
| tail | 查看文件结尾内容(默认后 10 行) | tail -20 log.txt(后 20 行) |
| tail -f filename | 实时监控文件新增内容(日志查看常用) | tail -f /var/log/messages |
| echo | 输出文本 / 变量 / 系统信息 |

cat (查看小文件)
注意:当文件内容较大时,文本内容会在屏幕上快速闪动(滚屏),用户往往看不清所显示的具体内容。因此对于较长文件内容可以按Ctrl+S键,停止滚屏;以及Ctrl+Q键可以恢复滚屏;而按Ctrl+C(中断)键则可以终止该命令的执行。或者对于大文件,干脆用more命令吧!
head 只看头10行
head命令以行为单位,取文件的内容,后面不接参数时默认打印前10行。
tail 只看尾10行
tail用于显示文件尾部的内容,默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”,则读取标准输入。
wc 统计文件内容信息
wc命令统计指定文件中的字节数、字数、行数,并将统计结果显示输出。利用wc指令我们可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据。wc同时也给出所指定文件的总统计数
more 一页一页的显示文件内容
more命令用于将内容较长的文本文件内容(不能在一屏显示完)进行分屏显示,并且支持在显示时定位关键字。而对于内容较少的文本文件内容则推荐使用cat命令查看。
less 与 more 类似,但是比 more 更好的是,他可以往前翻页
浏览文字档案的内容,用less命令显示文件时,PageUp键向上翻页,PageDown键向下翻页,要退出less程序,应按Q键。
less的作用与more十分相似,不同点为less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。
less 是 more 的增强版,功能更强大,日常使用中 less 更常用,但 more 因“简单、系统内置”仍有使用场景,两者核心区别如下:
| 特性 | more | less |
|---|---|---|
| 核心功能 | 分页显示(仅向下翻页为主) | 分页显示(支持上下自由翻页、复杂检索) |
| 翻页灵活性 | 仅支持向下翻页(b 向上翻页限制多) |
支持 ↑↓ 键逐行滚动,PageUp/PageDown 翻页 |
| 搜索功能 | 仅支持向下搜索(/关键词) |
支持上下搜索(/关键词 向下,?关键词 向上) |
| 内存占用 | 较小(加载部分内容) | 略大(但仍高效,支持大文件) |
| 适用场景 | 简单分页查看、新手入门、老旧系统 | 复杂日志分析、大文件查看、需要灵活检索 |
(5.1)cat (查看小文件)
cat(英文全称 concatenate,意为 “连接、拼接”)是 Linux 中最基础的文件内容操作命令,核心功能包括「查看文件内容」「拼接多个文件」「创建新文件」,操作简单高效,适合处理小到中等大小的文件(大文件推荐用 less/more 分页查看)。
| 参数 | 英文全称 | 功能说明 |
|---|---|---|
-n, --number |
number all output lines | 显示每行内容,并在开头添加行号(含空行) |
关键逻辑:
- 若指定多个
FILE:按顺序拼接所有文件内容并输出(默认输出到终端) - 若不指定
FILE或FILE为-:读取标准输入(键盘输入),按Ctrl+D结束输入 - 可通过重定向(
>/>>)将输出写入文件(而非终端)
| 需求 | 命令 | |
|---|---|---|
| 查看小文件内容 | cat file.txt |
|
| 查看文件并显示行号(非空行) | cat -b file.txt |
|
| 拼接多个文件到新文件 | cat a.txt b.txt > merged.txt |
|
| 追加文件内容到已有文件 | cat c.txt >> merged.txt |
|
| 快速创建小文件 | cat > note.txt(按 Ctrl+D 保存) |
|
| 清空文件内容 | cat /dev/null > file.txt |
|
| 查看文件时显示 Tab 和行尾 | cat -TE config.conf |
|
| 筛选文件中含关键词的行 | cat file.txt |
grep "keyword" |
(5.2)less(增强型分页查看工具)
less 是 Linux 中功能最强大的分页查看工具(more 的增强版),核心优势是“支持上下自由翻页、复杂检索、大文件高效加载”,完美解决 cat(大文件刷屏)和 more(仅支持单向翻页)的痛点,是日志分析、配置文件查看的首选工具。
| 需求 | 命令 | 关键操作 |
|---|---|---|
| 带行号查看日志(排查首选) | less -NM log.txt |
/error 搜索、n 下一个、q 退出 |
| 忽略大小写搜索日志 | less -i app.log |
/warning 匹配所有大小写的 warning |
| 实时监控新增日志 | less +F system.log |
Ctrl+C 暂停、F 恢复、q 退出 |
| 仅显示含“error”的行 | less -N log.txt → 输入 &error |
& 恢复所有行、q 退出 |
| 从第 100 行开始查看 | less +100 config.conf |
gg 回开头、G 到末尾 |
| 查看带颜色的日志 | less -r colored.log |
正常显示颜色格式,不出现乱码 |
![]() |
||
| 核心语法 |
less [OPTION]... [FILE]...
- 关键逻辑:
- 若指定
FILE:分页加载文件内容(仅加载当前屏幕内容,大文件启动极快); - 若不指定
FILE或FILE为-:读取标准输入(如管道传递的内容),分页显示; - 进入
less查看模式后,通过快捷键控制翻页、检索、退出(核心操作集中在快捷键)。
- 若指定
常用参数(重点必记)
| 参数 | 英文全称 | 功能说明 |
|---|---|---|
-i |
ignore case | 搜索时忽略大小写(默认区分大小写) |
-N |
line numbers | 显示每行的行号(定位内容、排查配置文件必备) |
-S |
chop long lines | 长行不折行(超出屏幕部分隐藏,按 Right 键查看,避免横向滚动混乱) |
-X |
no init | 退出 less 后,保留终端显示的内容(默认退出后清空屏幕) |
-M |
long prompt | 显示详细进度提示(底部显示“当前行号/总行数、百分比、文件路径”) |
-m |
short prompt | 显示简单进度提示(仅显示百分比) |
+NUM |
start at line NUM | 从文件第 NUM 行开始显示(如 less +200 log.txt 从第 200 行开始) |
+/PATTERN |
start at PATTERN | 从第一个匹配 PATTERN(关键词)的行开始显示(快速定位核心内容) |
-r |
raw control chars | 显示原始控制字符(如颜色码、特殊符号,适合查看带颜色的日志) |
核心操作快捷键(重中之重,牢记常用)
进入 less 查看模式后(如 less -N app.log),所有操作依赖快捷键,以下是按“使用频率”排序的核心快捷键:
1. 翻页与滚动(最基础)
| 快捷键 | 功能说明 |
|---|---|
| 空格键(Space) | 向下翻一页 |
PageDown 键 |
向下翻一页(等价于空格键) |
PageUp 键 |
向上翻一页 |
| 回车键(Enter) | 向下翻一行 |
↑/↓ 箭头键 |
向上/向下逐行滚动 |
Ctrl+F |
向下翻一页(等价于空格键) |
Ctrl+B |
向上翻一页(等价于 PageUp) |
G |
跳转到文件末尾(大写 G) |
gg |
跳转到文件开头(小写 g 两次) |
NUM+G |
跳转到第 NUM 行(如 50G 跳转到第 50 行) |
2. 检索与匹配(日志分析高频)
| 快捷键 | 功能说明 |
|---|---|
/关键词 |
向下搜索“关键词”(如 /error 搜索所有“error”) |
?关键词 |
向上搜索“关键词”(从当前位置往上找,如 ?success 找之前的“success”) |
n |
查看下一个匹配项(next,跟随上次搜索方向) |
N |
查看上一个匹配项(反向查找,如 /error 后按 N 找前一个“error”) |
* |
搜索当前光标所在的单词(无需手动输入,高效) |
# |
向上搜索当前光标所在的单词(等价于 ?当前单词) |
3. 其他实用操作
| 快捷键 | 功能说明 |
|---|---|
q |
退出 less 查看模式(核心退出键,必须牢记) |
h |
显示帮助信息(列出所有快捷键,忘记操作时调用) |
= |
显示当前位置详情(行号、总行数、文件大小、百分比) |
v |
用系统默认编辑器(如 vim)打开当前文件(查看时需修改内容必备) |
:/!命令 |
在 less 中执行系统命令(如 :/!ls 查看当前目录文件,执行后按 Enter 返回) |
&PATTERN |
仅显示匹配 PATTERN 的行(过滤无关内容,如 &error 只显示含“error”的行) |
&!PATTERN |
仅显示不匹配 PATTERN 的行(排除无关内容,如 &!info 隐藏含“info”的行) |
基础用法(日常高频场景)
1. 查看大文件(带行号+详细进度)
less -NM app.log
- 功能:分页查看
app.log,显示行号、底部显示“第 X 行/共 Y 行(百分比)”,大文件启动秒开。 - 操作:按
↑↓逐行滚、PageUp/PageDown翻页、/error搜索错误日志、q退出。
2. 忽略大小写搜索(日志排查常用)
less -i nginx.log
- 功能:查看
nginx.log,搜索时忽略大小写(输入/Error会匹配error/ERROR/Error)。 - 操作:输入
/404可找到所有 404 相关日志(无论大小写),按n查看下一个。
3. 快速定位关键词(跳过无关内容)
less +/Timeout /var/log/syslog
- 功能:直接跳转到
/var/log/syslog中第一个“Timeout”关键词的行,无需从头翻。 - 延伸:按
n遍历所有“Timeout”相关记录,高效排查超时问题。
4. 查看管道传递的内容(筛选后分页)
# 搜索日志中含“warning”的行,分页显示(避免结果刷屏)
grep "warning" system.log | less -N
# 查看目录下所有 .conf 文件列表,分页显示(文件多时有必要)
ls -l /etc/*.conf | less
5. 仅显示匹配的行(过滤冗余日志)
less -N app.log
- 进入查看模式后,输入
&error→ 仅显示含“error”的行,其他内容隐藏,专注排查错误。 - 取消过滤:输入
&(仅输入&回车),恢复显示所有行。
高级实用场景
1. 大文件断点续查(日志实时更新)
若日志文件正在实时写入(如 app.log 不断新增内容),用 less 可实时监控:
less +F app.log
- 功能:自动滚动到文件末尾,实时显示新增的日志内容(等价于
tail -f,但支持回溯查看)。 - 操作:按
Ctrl+C停止实时滚动,可回溯查看历史内容;按F恢复实时滚动,按q退出。
2. 查看带颜色的日志(保留格式)
部分日志(如 Java 日志)含颜色码,默认 less 会显示乱码,需加 -r 参数:
less -r colored_log.txt
- 功能:正常显示日志的颜色格式(如红色错误、绿色成功),排查时更直观。
3. 多文件切换查看
同时打开多个文件,在文件间自由切换:
less -N file1.txt file2.txt file3.txt
- 操作:
:n:切换到下一个文件(next);:p:切换到上一个文件(previous);:e 新文件路径:在当前less中打开新文件(如:e /tmp/new.log)。
4. 复制查看中的内容
在 less 中复制内容(以鼠标操作为例,终端需支持鼠标):
5. 按住 Shift 键,用鼠标选中需要复制的内容;
6. 选中后松开 Shift,右键点击选中区域,选择“复制”(或按 Ctrl+Shift+C);
- 说明:若终端不支持鼠标,可按
v用 vim 打开文件,复制后按:q返回less。
less 与 more/cat 的核心区别(选择指南)
| 工具 | 核心优势 | 核心劣势 | 适用场景 |
|---|---|---|---|
less |
上下自由翻页、复杂检索、大文件高效、支持过滤 | 快捷键较多需记忆 | 日志分析、大文件查看、配置文件排查(首选) |
more |
操作简单、系统内置 | 仅支持向下翻页、检索功能弱 | 新手简单分页查看、老旧系统 |
cat |
命令简单、一次性输出 | 大文件刷屏、无法分页 | 小文件(一屏内)快速查看、文件拼接 |
- 一句话选择:只要文件内容超过一屏,优先用
less;小文件直接用cat,新手怕记快捷键可先用more -d。
常见误区与注意事项
- 退出
less必须按q:进入查看模式后,输入任何字符都不会退出,必须按q(quit),新手容易忘记导致“卡住”。 +F实时监控的退出:按Ctrl+C停止实时滚动后,才能用q退出,直接按q无效。- 长行显示的选择:
- 想折行显示(避免横向滚动):默认不加分段
-S,长行会自动换行; - 想不折行(专注当前行):加
-S参数,超出部分按Right键查看。
- 想折行显示(避免横向滚动):默认不加分段
- 权限要求:查看文件需“读权限”(
r),否则报错less: 无法打开'file.txt': 权限不够,解决方案:sudo less file.txt或chmod +r file.txt。 - 大文件性能:
less仅加载当前屏幕内容,GB 级大文件启动速度远快于cat和more,是大文件查看的唯一选择。
(5.3)echo (输出文本/变量/系统信息)
echo 是 Linux 中最基础、最常用的命令之一,核心功能是「在终端输出指定的文本、变量值或系统信息」,支持字符串拼接、转义字符、重定向等实用功能,是脚本编写、快速验证的必备工具。
| 需求 | 命令 | 效果/说明 |
|---|---|---|
| 输出普通文本 | echo "Hello" |
终端输出 Hello |
| 输出后不换行 | echo -n "Input: " |
输出后无换行,作为输入提示 |
| 换行+制表符 | echo -e "a\tb\nc\td" |
a b c d |
| 输出变量值 | echo "用户:$USER" |
输出当前用户(如 root) |
| 输出命令结果 | echo "日期:$(date)" |
输出当前日期时间 |
| 覆盖写入文件 | echo "content" > file.txt |
创建/清空 file.txt 并写入内容 |
| 追加写入文件 | echo "content" >> file.txt |
在 file.txt 末尾添加内容 |
| 输出绿色成功提示 | echo -e "\e[32m成功\e[0m" |
终端显示绿色“成功” |
| 单行刷新进度 | echo -ne "进度:50%\r" |
回到行首覆盖原有内容 |
核心语法
echo [OPTION]... [STRING]...
- 关键逻辑:
STRING:可是直接输入的文本(如"Hello")、变量(如$PATH)、命令执行结果(如$(date));- 若不指定
STRING:仅输出一个空行(等价于echo ""); - 支持通过重定向(
>/>>)将输出写入文件,而非终端。
常用参数(重点必记)
| 参数 | 英文全称 | 功能说明 |
|---|---|---|
-n |
no trailing newline | 输出后不换行(默认输出后会自动加一个换行符) |
-e |
enable interpretation of backslash escapes | 启用转义字符解析(如 \n 换行、\t 制表符,默认不解析转义) |
-E |
disable interpretation of backslash escapes | 禁用转义字符解析(默认行为,可省略) |
核心转义字符(需配合 -e 使用)
| 转义字符 | 功能 | 示例(echo -e "xxx") |
输出效果 |
|---|---|---|---|
\n |
换行 | "line1\nline2" |
line1 line2 |
\t |
制表符(Tab,缩进) | "name\tage" |
name age |
\\ |
输出反斜杠(\)本身 |
"a\\b" |
a\b |
\" |
输出双引号(") |
"He said: \"Hello\"" |
He said: "Hello" |
\' |
输出单引号(') |
"It\'s mine" |
It's mine |
\r |
回车(覆盖当前行前面的内容) | "abc\r123" |
123(覆盖了前面的 abc) |
\c |
输出到此处停止(忽略后续内容) | "Hello\cWorld" |
Hello |
基础用法(日常高频场景)
1. 输出普通文本(最常用)
# 输出直接文本(单引号、双引号均可,无特殊需求时可省略引号)
echo "Hello Linux"
echo 'Hello Shell'
echo Hello World
- 效果:终端依次输出
Hello Linux、Hello Shell、Hello World(每行一个)。 - 引号区别:单引号(
' ')不解析变量和转义字符,双引号(" ")会解析,后续详细说明。
2. 输出后不换行(-n 参数)
# 两个 echo 输出在同一行
echo -n "Enter your name: "
echo "User input received"
- 效果:
Enter your name: User input received(无换行,适合作为输入提示)。
3. 解析转义字符(-e 参数)
[root@node01 usr]# echo "hello\nworld"
hello\nworld
[root@node01 usr]# echo -e "hello\nworld"
hello
world
# 换行+制表符示例
echo -e "Name\tAge\tCity"
echo -e "Zhang\t25\tBeijing"
echo -e "Li\t30\tShanghai"
# 输出双引号和反斜杠
echo -e "Path: /home/user\nFile: \"data.txt\""
echo -e "Directory: /var/log\\nginx"
- 效果:
Name Age City Zhang 25 Beijing Li 30 Shanghai Path: /home/user File: "data.txt" Directory: /var/log/nginx
4. 输出变量值(脚本/终端验证常用)
echo 可直接输出环境变量、自定义变量的值,必须用双引号或无引号(单引号会原样输出变量名):
# 输出系统环境变量(如 PATH、USER)
echo "当前用户:$USER"
echo "系统路径:$PATH"
# 输出自定义变量
name="Alice"
age=28
echo "姓名:$name,年龄:$age" # 双引号解析变量
echo '姓名:$name,年龄:$age' # 单引号不解析,输出:姓名:$name,年龄:$age
- 效果:
当前用户:root 系统路径:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin 姓名:Alice,年龄:28 姓名:$name,年龄:$age
5. 输出命令执行结果($() 或 ` ` 包裹)
通过 $() 或反引号 ` ` 执行命令,将结果作为 echo 的输出内容:
# 输出当前日期时间
echo "当前时间:$(date)"
# 输出当前目录下的文件数(配合 ls 和 wc 命令)
echo "当前目录文件数:$(ls | wc -l)"
# 反引号写法(等价于 $(),推荐用 $() 更易嵌套)
echo "当前路径:`pwd`"
- 效果:
当前时间:2025年11月04日 星期二 15:30:00 CST 当前目录文件数:12 当前路径:/root
高级实用场景
1. 字符串拼接(无需额外符号)
echo 中字符串、变量、命令结果可直接拼接,无需 + 等连接符:
name="Bob"
echo "Hello $name! Today is $(date +%Y-%m-%d)."
echo "文件路径:/home/$name/docs/$(ls docs | head -1)"
- 效果:
Hello Bob! Today is 2025-11-04. 文件路径:/home/Bob/docs/config.txt
2. 重定向输出到文件(覆盖/追加)
将 echo 的输出写入文件,而非终端,是脚本中写入配置、日志的常用方式:
# 覆盖写入文件(文件不存在则创建,存在则清空原有内容)
echo "server_ip=192.168.1.100" > config.conf
echo "port=8080" >> config.conf # 追加写入(保留原有内容,添加到末尾)
# 批量写入多行内容(配合 -e 换行)
echo -e "line1\nline2\nline3" > data.txt
- 结果:
config.conf中内容为:server_ip=192.168.1.100 port=8080
3. 输出到系统日志(/var/log/messages)
通过 tee 命令配合 sudo,将 echo 内容写入系统日志(需 root 权限):
sudo echo "[$(date)] 自定义系统日志:服务启动成功" | tee -a /var/log/messages
- 说明:
tee -a表示追加写入,/var/log/messages是系统默认日志文件(部分系统为/var/log/syslog)。
4. 脚本中的进度提示(配合 \r 覆盖行)
用 \r 实现“单行刷新”的进度提示,适合脚本执行时显示进度:
# 模拟进度条(循环输出 0-100%)
for ((i=0; i<=100; i++)); do
echo -ne "进度:$i%\r" # -n 不换行,-e 解析 \r,\r 回到行首覆盖
sleep 0.05 # 暂停 0.05 秒,模拟进度
done
echo -e "\n执行完成!"
- 效果:终端单行实时刷新进度(0%→1%→...→100%),最后显示“执行完成!”。
5. 输出颜色文本(终端美化)
通过 ANSI 颜色码(配合 -e)输出带颜色的文本,适合脚本提示(如成功绿色、错误红色):
# 颜色码格式:\e[颜色编号m 文本 \e[0m(0m 重置颜色)
echo -e "\e[32m成功:操作执行完成!\e[0m" # 32m=绿色
echo -e "\e[31m错误:文件不存在!\e[0m" # 31m=红色
echo -e "\e[33m警告:权限不足,请谨慎操作!\e[0m" # 33m=黄色
echo -e "\e[34m信息:当前版本 v1.0.0\e[0m" # 34m=蓝色
- 效果:终端输出对应颜色的文本,增强视觉区分度。
常见误区与注意事项
1. 单引号 vs 双引号 vs 无引号:
- 单引号(
' '):完全原样输出,不解析变量、转义字符、命令(适合输出纯文本); - 双引号(
" "):解析变量、转义字符、命令(适合输出含变量/特殊字符的内容); - 无引号:与双引号类似,但会忽略多余空格(如
echo a b输出a b,双引号则保留两个空格)。 - 示例:
echo '$USER' # 输出 $USER(单引号不解析) echo "$USER" # 输出 root(双引号解析变量) echo a b # 输出 a b(无引号合并空格) echo "a b" # 输出 a b(双引号保留空格)
2. 转义字符必须加 -e:
若不加 -e,\n、\t 等转义字符会原样输出(如 echo "line1\nline2" 输出 line1\nline2),需配合 -e 才能生效。
3. 变量名与字符串的边界:
若变量名后紧跟字母/数字,需用 ${变量名} 明确边界,否则 echo 会误判变量名:
name="Tom"
echo "$names" # 错误:寻找变量 $names(不存在),输出空
echo "${name}s" # 正确:解析 $name 后拼接 s,输出 Toms
4. 重定向覆盖风险:
echo "内容" > 文件 会直接覆盖文件原有内容,无恢复可能,操作前需确认文件无重要数据(如需保留,用 >> 追加)。
5. 特殊字符的处理:
若输出内容含 !、$、& 等特殊字符,需用单引号包裹或转义(\),否则会被 shell 解析为命令/变量:
echo "I love Linux! $SHELL" # 错误:! 会被解析为历史命令(bash 中)
echo 'I love Linux! $SHELL' # 正确:单引号原样输出
echo "I love Linux\! \$SHELL" # 正确:转义特殊字符,输出 I love Linux! $SHELL
(5.4)> 输出重定向和 >> 追加
Linux 重定向是核心基础技能,核心是改变命令的默认输入 / 输出来源 / 目的地(默认输入是键盘,默认输出是终端屏幕),通过特殊符号实现 “文件读写”“日志记录”“错误捕获” 等功能,是脚本编写、系统管理的必备工具。
| 符号组合 | 功能描述 | 适用场景 |
|---|---|---|
命令 > 文件 |
标准输出覆盖写入文件 | 生成全新文件、临时测试 |
命令 >> 文件 |
标准输出追加写入文件 | 日志记录、持续追加内容 |
命令 2> 文件 |
标准错误覆盖写入文件 | 单独捕获错误信息 |
命令 2>> 文件 |
标准错误追加写入文件 | 持续记录错误日志 |
命令 &> 文件 |
合并 stdout/stderr 覆盖写入文件 | 一次性记录所有输出(覆盖) |
命令 &>> 文件 |
合并 stdout/stderr 追加写入文件 | 脚本日志、完整记录执行过程 |
命令 > /dev/null 2>&1 |
丢弃所有输出(正常 + 错误) | 安静执行命令、屏蔽无用信息 |
命令 < 文件 |
从文件读取标准输入 | 批量输入、脚本批量处理 |
命令 << EOF |
Here Document 多行输入 | 脚本中批量写入文件 |
一、核心概念:3 种标准流(重定向的基础)
Linux 中所有命令的输入 / 输出都基于「标准流」,重定向本质是修改这 3 个流的指向:
| 流名称 | 英文全称 | 编号 | 默认指向 | 作用说明 |
|---|---|---|---|---|
| 标准输入 | Standard Input | 0 | 键盘 | 命令读取输入的来源(如 read 命令) |
| 标准输出 | Standard Output | 1 | 终端屏幕 | 命令正常执行的输出结果(如 ls 的列表) |
| 标准错误输出 | Standard Error | 2 | 终端屏幕 | 命令执行失败的错误信息(如 rm: 无此文件) |
关键:默认情况下,
stdout(1)和stderr(2)都输出到终端,因此正常结果和错误信息会混在一起;重定向的核心是将它们分离或写入文件。
二、核心重定向符号(按常用程度排序)
1. 标准输出重定向(覆盖 / 追加)
(1)>:覆盖写入(危险!清空原有内容)
-
语法:
命令 > 目标文件(等价于命令 1> 目标文件,1 可省略) -
功能:将命令的正常输出写入目标文件,若文件不存在则创建,若已存在则清空原有内容(覆盖风险高)。
-
示例:
# 将 ls -l 的结果覆盖写入 list.txt(原有内容消失) ls -l > list.txt # 等价写法(显式指定 stdout 编号1) echo "Hello" 1> hello.txt
(2)>>:追加写入(安全!保留原有内容)
-
语法:
命令 >> 目标文件(等价于命令 1>> 目标文件) -
功能:将命令的正常输出追加到目标文件末尾,文件不存在则创建,不影响原有内容(日常首选)。
-
示例:
# 将 date 结果追加到 log.txt(原有内容保留,新增一行) date >> log.txt # 批量追加:将多个命令输出写入同一文件 echo "=== 系统信息 ===" >> system.info uname -r >> system.info free -h >> system.info
2. 标准错误输出重定向(捕获错误)
(1)2>:覆盖写入错误信息
-
语法:
命令 2> 错误文件 -
功能:将命令的错误输出(仅错误信息)覆盖写入文件,不影响正常输出(仍显示在终端)。
-
示例:
# 故意删除不存在的文件,将错误信息写入 error.log rm non_exist.txt 2> error.log # 终端无错误显示,错误信息保存在 error.log 中
(2)2>>:追加写入错误信息
-
语法:
命令 2>> 错误文件 -
功能:将错误信息追加到文件末尾,适合持续捕获脚本执行错误。
-
示例:
# 循环执行命令,错误信息持续追加到 error.log for file in *.txt; do cat $file 2>> read_error.log # 读取失败的错误追加记录 done
3. 混合重定向(同时处理 stdout 和 stderr)
(1)&> / >&:合并输出(正常 + 错误都写入)
-
语法:
命令 &> 目标文件或命令 > 目标文件 2>&1(两种写法等价,推荐后者兼容性更好) -
功能:将正常输出(1)和错误输出(2)合并,一起写入目标文件(覆盖模式)。
-
示例:
# 安装软件时,将正常日志和错误都覆盖写入 install.log sudo yum install nginx &> install.log # 等价兼容写法(先重定向 stdout,再让 stderr 跟随 stdout) sudo apt install nginx > install.log 2>&1
(2)&>>:合并追加(正常 + 错误都追加)
-
语法:
命令 &>> 目标文件或命令 >> 目标文件 2>&1 -
功能:合并正常和错误输出,追加到文件末尾(日志记录首选)。
-
示例:
# 运行脚本,所有输出(正常+错误)都追加到脚本日志 ./backup.sh &>> backup_202511.log # 等价写法 ./backup.sh >> backup_202511.log 2>&1
4. 标准输入重定向(从文件读取输入)
(1)<:从文件读取输入
-
语法:
命令 < 输入文件(等价于命令 0< 输入文件) -
功能:让命令从文件读取输入,而非键盘(适合批量输入场景)。
-
示例:
# 统计文件行数(等价于 wc -l data.txt,但体现重定向逻辑) wc -l < data.txt # 从文件读取内容作为 echo 输入(实际用得少,cat 更直接) cat < config.conf
(2)<<:Here Document(多行输入)
-
语法:
命令 << 分隔符(分隔符自定义,如 EOF、END) -
功能:在终端输入多行内容,直到遇到指定分隔符为止,将内容作为命令的输入(脚本中批量写入文件常用)。
-
示例:
# 批量写入多行内容到 config.conf(无需反复 echo >>)
cat > config.conf << EOF
server_ip=192.168.1.100
port=8080
timeout=30
EOF
# 输入到 EOF 结束,内容自动写入 config.conf
5. 特殊目标:/dev/null(丢弃输出)
/dev/null 是 Linux 中的 “空设备文件”,任何写入它的内容都会被丢弃(相当于 “黑洞”),适合屏蔽无用输出。
-
语法:
命令 > /dev/null 2>&1(丢弃所有输出) -
示例:
# 执行命令但不显示任何输出(正常和错误都丢弃) ping -c 1 baidu.com > /dev/null 2>&1 # 仅丢弃错误输出,正常输出保留 ls /tmp/* > result.txt 2>/dev/null
三、日常高频场景示例
1. 日志记录(脚本 / 命令输出持久化)
# 备份数据库,记录所有输出(成功+失败)到日志,同时在终端显示
mysqldump -u root -p db_name > backup.sql 2>&1 | tee backup.log
# 说明:tee 命令实现“文件写入+终端输出”双备份
2. 脚本批量写入配置文件
# 用 Here Document 快速创建 Nginx 配置
cat > /etc/nginx/conf.d/myapp.conf << EOF
server {
listen 80;
server_name myapp.com;
root /var/www/myapp;
}
EOF
3. 屏蔽无用输出(安静执行命令)
# 安装软件时不显示多余日志,仅保留错误(适合自动化脚本)
sudo yum install -y wget &> /dev/null
# 查找文件时屏蔽“权限不够”的错误提示
find / -name "nginx.conf" 2>/dev/null
4. 分离正常输出和错误输出
# 执行命令,正常结果写入 output.txt,错误写入 error.txt
python script.py > output.txt 2> error.txt
# 后续可分别分析:查看结果 vs 排查错误
cat output.txt
cat error.txt
5. 重定向到多个文件(配合 tee)
# 将 ls -l 的结果同时写入 file1.txt 和 file2.txt,且终端显示
ls -l | tee file1.txt file2.txt
# 追加模式(同时追加到两个文件)
date | tee -a log1.txt log2.txt
四、常见误区与注意事项
-
2>&1的顺序不能颠倒:- 正确:
命令 > file.txt 2>&1(先指定 stdout 到 file.txt,再让 stderr 跟随 stdout) - 错误:
命令 2>&1 > file.txt(先让 stderr 跟随 stdout(终端),再将 stdout 写入文件,导致 stderr 仍输出到终端)
- 正确:
-
覆盖 vs 追加的选择:
- 临时测试、生成全新文件:用
>(覆盖); - 日志记录、持续追加内容:用
>>(追加),避免误删重要数据。
- 临时测试、生成全新文件:用
-
权限要求:
- 写入文件时,需对目标文件所在目录有「写权限(w)」,否则报错
权限不够; - 解决方案:切换 root 用户(
sudo -i)或给目录授权(chmod +w 目录)。
- 写入文件时,需对目标文件所在目录有「写权限(w)」,否则报错
-
管道(|)与重定向的区别:
- 管道
|:将前一个命令的 stdout 传递给后一个命令(如ls | grep txt); - 重定向
>/>>:将命令的 stdout/stderr 写入文件(而非传递给命令); - 示例:
ls -l | tee file.txt(管道 + 重定向结合:stdout 既传递给 tee,又写入文件)。
- 管道
-
Here Document 的分隔符规则:
-
分隔符前后不能有空格(如
<< EOF正确,<< EOF错误); -
若分隔符用单引号(
<< 'EOF'),则内部变量不解析(原样输出);无引号则解析变量。 -
示例:
-
name="Alice"
cat << 'EOF' > test.txt # 单引号分隔符,变量不解析
Hello $name
EOF
# test.txt 内容:Hello $name(而非 Hello Alice)
(5.5)tail 查看文件末尾
tail 是 Linux 核心文件查看命令,核心功能是查看文件的末尾内容(默认最后 10 行),尤其适合实时监控日志文件(如系统日志、应用日志),操作简洁高效。
关键参数(必记 3 个)
| 参数 | 功能 |
|---|---|
-f |
实时追踪文件新增内容(日志监控首选) |
-n 数字 |
查看最后 N 行(如 -n 5 查看最后 5 行) |
-F |
等同于 -f + 自动重试(文件被删除重建后仍能继续监控,比 -f 更稳定) |
核心用法(3 个高频场景)
1. 查看文件末尾 10 行(默认)
tail 文件名
# 示例:查看 app.log 的最后 10 行
tail app.log
2. 查看指定行数的末尾内容
用 -n 指定行数(n=number):
tail -n 行数 文件名
# 示例:查看 syslog 的最后 20 行
tail -n 20 /var/log/syslog
# 简写(去掉 n):tail -20 /var/log/syslog
3. 实时监控文件新增内容(最常用)
用 -f 实时追踪文件变化(f=follow),文件新增内容会即时输出,按 Ctrl+C 退出:
tail -f 文件名
# 示例:实时监控 nginx 访问日志
tail -f /var/log/nginx/access.log
| 操作 | 功能 | 场景说明 |
|---|---|---|
Ctrl+S |
暂停日志输出(冻结屏幕) | 日志滚动太快时,按下后可仔细查看当前显示的内容,避免错过关键信息 |
Ctrl+Q |
恢复日志输出(解冻屏幕) | 查看完后按下,继续接收文件新增的内容(tail -f 仍在后台追踪) |
(5.6)创建软链接(快捷方式)
ln -s [源文件/目录的绝对路径或相对路径] [软链接名称/路径]
假设当前目录有文件 readme.txt,创建软链接 readme_link 指向它:
# 相对路径示例(源文件和软链接在同一目录)
ln -s readme.txt readme_link
# 绝对路径示例(更推荐,即使移动软链接也可能生效)
ln -s /home/user/docs/readme.txt /home/user/readme_link



浙公网安备 33010602011771号