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 系统核心命令目录(如 lscp 等基础命令),普通用户即可执行,是系统启动必需的命令集合。
/sbin 系统管理命令目录(如 ifconfigreboot 等),需管理员权限执行,用于系统级操作。
/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后跟工具名的方法来实现。
  • “--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),以下是高频参数说明:
image

参数 英文含义 功能描述
-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 安全上下文标记,默认可忽略)

PixPin_2025-11-05_15-33-29

dr-xr-x---. 为例,逐位解释:

  1. 第 1 位:文件类型

    • d:目录(directory),如 ....pki
    • -:普通文件(file),如 anaconda-ks.cfgdefault.conf
    • l:符号链接(link)(当前输出中没有)
    • b:块设备文件(如硬盘)
    • c:字符设备文件(如键盘)
  2. 第 2-4 位:所有者权限(u)

    所有者对该文件 / 目录的操作权限,3 位分别对应 读(r)写(w)执行(x)

    • 示例 r-x:所有者拥有「读(r=4)+ 执行(x=1)」权限,无写权限(- 表示无此权限)

    • 常见组合:rwx(完全控制)、rw-(读 + 写,无执行)、r--(仅读)

  3. 第 5-7 位:所属组权限(g)

    同组用户的操作权限,格式和含义和「所有者权限」一致:

    • 示例 r-x:所属组用户拥有「读 + 执行」权限,无写权限
  4. 第 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----- 组内共享配置文件 所有者读 + 写,同组仅读,其他无权限

三、快速换算技巧

  1. 数字权限 = 3 组数字拼接(如 755 = 所有者 7 + 所属组 5 + 其他用户 5)

  2. 单组数字计算:r=4、w=2、x=1,按需求和

    例:r-x=4+0+1=5,rw-=4+2+0=6,rwx=4+2+1=7

  3. 反向推导:已知数字权限,快速写字符串

    例: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 功能:一次性创建 aa/ba/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
image

一、核心语法

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.txtphoto.jpgdata.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)和目录结构,直接复制所有内容。

五、常见误区与注意事项

  1. 复制目录必须加 -r/-a:直接执行 cp dir1 dir2 会报错 cp: 略过目录'dir1',必须加 -r

  2. 区分软链接和硬链接

    • -s 软链接:删除源文件后,链接失效(红底白字闪烁)

    • -l 硬链接:删除源文件后,链接仍可用(共享同一个 inode)

  3. 覆盖风险cp -f 会直接覆盖目标文件,无恢复可能,操作系统文件(如 /etc/ 下的文件)时务必谨慎。

  4. 大文件复制:复制超大文件(如几十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,目录内所有内容不变(无需加 -rmv 对目录默认支持递归移动)。

     

2. 移动文件/目录到指定位置

  • 示例 1:移动单个文件到目标目录

    mv photo.jpg /home/user/Pictures/
    

    功能:将当前目录的 photo.jpg 移动到 /home/user/Pictures/ 目录,文件名不变。

  • 示例 2:移动多个文件到同一目录

    mv file1.txt data.csv docs/
    

    功能:同时将 file1.txtdata.csv 两个文件移动到 docs/ 目录下。

  • 示例 3:移动目录到目标位置

    mv /tmp/project/ /home/user/workspace/
    

    功能:将 /tmp/project/ 目录(含所有子内容)移动到 /home/user/workspace/ 目录下,无需加 -rmv 处理目录无需递归参数)。

     

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/

五、常见误区与注意事项

  1. 移动目录无需加 -r:与 cp 不同,mv 处理目录时不需要 -r 参数,直接写目录路径即可(mv dir1 dir2 合法)。

  2. 跨文件系统移动的差异

    • 同一文件系统(如同一硬盘分区):mv 仅修改路径引用,速度极快(无文件复制);

    • 不同文件系统(如本地硬盘 → U 盘):mv 会先复制文件到目标位置,再删除源文件,速度取决于文件大小。

  3. 权限要求

    • 执行用户需具备:① 源文件/目录的“读+执行权限”(能访问和移动);② 目标目录的“写+执行权限”(能创建文件/目录)。

    • 权限不足报错:mv: 无法创建普通文件'XXX': 权限不够,解决方案:sudo mv 源 目标

  4. 避免循环移动:不要将目录移动到自身子目录,会报错或导致目录结构异常,例如:

    mv docs/ docs/subdir/  # 错误:将 docs 移动到自己的子目录 subdir
    
  5. 符号链接的移动规则

    • 移动符号链接本身: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命令只能向前浏览。

lessmore 的增强版,功能更强大,日常使用中 less 更常用,但 more 因“简单、系统内置”仍有使用场景,两者核心区别如下:

特性 more less
核心功能 分页显示(仅向下翻页为主) 分页显示(支持上下自由翻页、复杂检索)
翻页灵活性 仅支持向下翻页(b 向上翻页限制多) 支持 ↑↓ 键逐行滚动,PageUp/PageDown 翻页
搜索功能 仅支持向下搜索(/关键词 支持上下搜索(/关键词 向下,?关键词 向上)
内存占用 较小(加载部分内容) 略大(但仍高效,支持大文件)
适用场景 简单分页查看、新手入门、老旧系统 复杂日志分析、大文件查看、需要灵活检索

(5.1)cat (查看小文件)

cat(英文全称 concatenate,意为 “连接、拼接”)是 Linux 中最基础的文件内容操作命令,核心功能包括「查看文件内容」「拼接多个文件」「创建新文件」,操作简单高效,适合处理小到中等大小的文件(大文件推荐用 less/more 分页查看)。

参数 英文全称 功能说明
-n, --number number all output lines 显示每行内容,并在开头添加行号(含空行)

关键逻辑:

  • 若指定多个 FILE:按顺序拼接所有文件内容并输出(默认输出到终端)
  • 若不指定 FILEFILE-:读取标准输入(键盘输入),按 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 正常显示颜色格式,不出现乱码
image
核心语法
less [OPTION]... [FILE]...
  • 关键逻辑:
    • 若指定 FILE:分页加载文件内容(仅加载当前屏幕内容,大文件启动极快);
    • 若不指定 FILEFILE-:读取标准输入(如管道传递的内容),分页显示;
    • 进入 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

常见误区与注意事项

  1. 退出 less 必须按 q:进入查看模式后,输入任何字符都不会退出,必须按 q(quit),新手容易忘记导致“卡住”。
  2. +F 实时监控的退出:按 Ctrl+C 停止实时滚动后,才能用 q 退出,直接按 q 无效。
  3. 长行显示的选择
    • 想折行显示(避免横向滚动):默认不加分段 -S,长行会自动换行;
    • 想不折行(专注当前行):加 -S 参数,超出部分按 Right 键查看。
  4. 权限要求:查看文件需“读权限”(r),否则报错 less: 无法打开'file.txt': 权限不够,解决方案:sudo less file.txtchmod +r file.txt
  5. 大文件性能less 仅加载当前屏幕内容,GB 级大文件启动速度远快于 catmore,是大文件查看的唯一选择。

(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 LinuxHello ShellHello 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

四、常见误区与注意事项

  1. 2>&1 的顺序不能颠倒

    • 正确:命令 > file.txt 2>&1(先指定 stdout 到 file.txt,再让 stderr 跟随 stdout)
    • 错误:命令 2>&1 > file.txt(先让 stderr 跟随 stdout(终端),再将 stdout 写入文件,导致 stderr 仍输出到终端)
  2. 覆盖 vs 追加的选择

    • 临时测试、生成全新文件:用 >(覆盖);
    • 日志记录、持续追加内容:用 >>(追加),避免误删重要数据。
  3. 权限要求

    • 写入文件时,需对目标文件所在目录有「写权限(w)」,否则报错 权限不够
    • 解决方案:切换 root 用户(sudo -i)或给目录授权(chmod +w 目录)。
  4. 管道(|)与重定向的区别

    • 管道 |:将前一个命令的 stdout 传递给后一个命令(如 ls | grep txt);
    • 重定向 >/>>:将命令的 stdout/stderr 写入文件(而非传递给命令);
    • 示例:ls -l | tee file.txt(管道 + 重定向结合:stdout 既传递给 tee,又写入文件)。
  5. 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
posted @ 2020-01-18 23:09  【唐】三三  阅读(257)  评论(0)    收藏  举报