一、Linux目录结构
Linux的目录结构遵循FHS(文件系统层次结构标准),核心特点是一切从根(/)开始,采用树状倒挂结构。如图1所示。、
图 1
- 系统启动必看(别乱动)
/boot:存放内核(vmlinuz)、引导加载程序(grub)等。如果误删,系统将无法启动。
/etc:系统神经中枢。存放所有系统级配置文件(如网络、软件源、用户密码)。大部分系统设置都在这里修改。
/sys:内核的虚拟映射。存放内核参数和设备信息,用于动态修改内核行为(如电源管理)。
- 命令与库文件(软件运行依赖)
/bin 与 /sbin:早期存放基础命令(如 ls、cp)和系统管理命令(如 fdisk)。现代发行版(如CentOS 7+)中,它们通常是指向 /usr/bin 的软链接。
/lib 与 /lib64:存放系统基础库文件(类似Windows的DLL文件)。同样,现代系统通常指向 /usr/lib。
- 用户自己的地盘(你的操作区)
/home:普通用户的家目录。比如用户 alice 的数据在 /home/alice,对应快捷符号 ~。
/root:超级管理员(root)的家目录。出于安全考虑,独立放在根下,不混入普通用户区。
- 数据挂载点(接入外部存储)
/mnt 与 /media:临时挂载点。/mnt 用于手动挂载(如修复系统),/media 用于自动挂载(如插入U盘)。
/dev:设备文件目录。所有硬件(硬盘、鼠标、终端)都映射为这里的文件(如 /dev/sda 代表第一块硬盘)。
- 动态与临时数据(关机即消失)
/tmp:临时文件存放地。系统重启后通常清空,任何人都可读写,但不能存放重要数据。
/run:存放系统启动以来的运行时数据(如进程PID)。关机即消失。
- 庞大的软件生态
/usr:Unix系统软件资源,这是最大的目录。绝大多数的用户应用程序和文件都安装在这里,相当于Windows的 Program Files。
/usr/bin:用户级命令。
/usr/sbin:系统管理命令。
/usr/lib:库文件。
/usr/local:手动编译安装的软件默认路径(独立于包管理器)。
/usr/share:共享数据(文档、图标、字体等)。
/opt:大型第三方软件安装目录(如Oracle、Google Chrome),通常以独立文件夹存在。
- 虚拟与进程信息
/proc:内存中的虚拟文件系统。存放当前运行进程和内核状态信息(如 /proc/cpuinfo 查看CPU)。不占硬盘空间。
- 动态数据仓库(系统的“工作日志室”)
/var:存放系统运行过程中会持续变化的数据(variable data),如日志、缓存、队列等。它与 /usr(静态程序)和 /etc(静态配置)形成互补,让 /usr 可以被挂载为“只读”以增强安全性。以下是最常用子目录:
/var/log/:系统日志大本营。记录系统和所有服务(如Nginx、MySQL)的运行状态、错误信息,是运维排查问题的第一站。常见文件有 syslog、auth.log、dmesg 等。
/var/spool/:任务队列池。存放等待被处理的数据,如待发送的邮件(/var/spool/mail/)、打印任务(/var/spool/cups/)等。
/var/cache/:应用程序缓存。存放可被重新生成的临时缓存数据,如 apt 的软件包缓存(/var/cache/apt/),清理后不影响系统运行。
/var/lib/:程序状态数据库。存放应用程序需要永久保存的状态信息,如 MySQL 数据库文件(/var/lib/mysql/)、RPM 包数据库等。
/var/run/:运行时数据。存放系统启动以来的进程PID文件等。现代系统中,该目录通常是指向 /run 的软链接。
/var/lock/:资源锁文件。当某个程序占用硬件或文件资源时,在这里创建锁文件,防止其他程序冲突访问。
二、Linux基础命令
- 简单命令
- pwd:显示当前所在的完整路径。
- ls:列出目录内容。
- -l:显示详细信息
- -a:显示隐藏文件
- -h:将文件的大小显示为简单易懂的单位
- 空格+路径:查看对应目录
- cd:切换目录。.. 返回上级目录,~ 返回用户主目录,- 返回上一个目录,/返回根目录。
- mkdir:创建目录。
- 新建单个目录:mkdir 目录名
- 一次性新建多个目录:mkdir 目录1 目录2 目录3
- -p:递归创建多层嵌套目录,目录已存在不报错,工作最常用
- -m:创建同时直接指定目录权限
- touch:创建空文件或更新文件时间戳。
- 创建空文件:touch file.txt
如果 file.txt 不存在,会新建一个空文件;如果已存在,则只更新其时间戳。
- 一次创建多个文件:touch a.txt b.txt c.txt
- 使用 -t 指定时间:touch -t 202601311200 file.txt
将 file.txt 的时间戳改为 2026年1月31日 12:00
- 使用 -r 参考其他文件:touch -r ref.txt file.txt
让 file.txt 的时间戳和 ref.txt 保持一致
- rmdir:删除空目录。
- 删除单个空目录:rmdir 目录名
- 删除多个空目录:rmdir 目录1 目录2 目录3
- 核心硬性规则:只能删除空目录,非空目录无法删除
- -p:递归删除多层嵌套空目录
- rm:删除文件或目录。
- 删除单个文件: rm 文件名
- 删除多个文件: rm 文件1 文件2 文件3
- -r: 递归删除,用于删除目录及其内部所有内容
- -f: 强制删除,不提示确认,忽略不存在的文件
- -i: 交互式删除,每次删除前都询问确认
- cp:复制文件或目录。
- 复制文件:cp 源文件 目标文件
- 复制文件到目录:cp 源文件 目标目录/
- -r:递归复制,用于复制目录(必加)
- -i:交互式复制,目标存在时询问是否覆盖
- -f:强制复制,目标存在时直接覆盖不询问
- -p:保留文件属性(权限、时间戳等)
- 使用示例:
- 复制文件并重命名:cp original.txt backup.txt
将 original.txt 复制为 backup.txt
- 复制文件到目录cp file.txt /home/user/Documents/
- 复制整个目录(必须加 -r)cp -r project/ project_backup/
将 project 目录完整复制到 project_backup
- 复制多个文件到目录cp a.txt b.txt c.txt target_dir/
- 保留文件属性复制cp -p config.conf config_backup.conf
复制的文件保持原权限和修改时间不变
- 使用通配符批量复制cp *.log logs/
将所有 .log 文件复制到 logs 目录
- mv:移动/重命名文件或目录。
- 重命名:mv 原文件名 新文件名
- 移动文件到目录:mv 源文件 目标目录/
- 移动目录:mv 源目录 目标目录/
- -i:交互式移动,目标存在时询问是否覆盖
- -f:强制移动,目标存在时直接覆盖不询问
- -u:只移动比目标文件更新的文件(增量更新)
- 使用示例:
- 重命名文件mv old_name.txt new_name.txt
- 重命名目录mv project/ project_backup/
- 移动文件到其他目录mv file.txt /home/user/Documents/
- 移动多个文件到目录mv a.txt b.txt c.txt target_dir/
- 移动目录mv myfolder/ /backup/
将整个 myfolder 目录移动到 /backup/ 下
- 结合通配符批量移动mv *.log logs/
移动所有 .log 文件到 logs 目录
- mv file_{1..10}.txt archive/
移动file1.txt~file10.txt文件到 archive 目录
- cat、less、more:查看文件内容。
对比维度 | cat | more | less |
显示方式 | 一次性输出全部内容 | 分屏显示,按空格翻页 | 分屏显示,按空格翻页 |
向上翻页 | 无法翻页 | 有限支持(按 b,但依赖版本) | 流畅支持(按 b 或 k) |
向下翻页 | 无法翻页 | 按空格/回车 | 按空格/回车 |
跳转到开头/结尾 | ❌ | ❌ | 按 g / G |
搜索功能 | ❌ | 支持(/关键词) | 支持(/ 和 ? 双向搜索) |
查看时编辑 | ❌ | ❌ | 按 v 进入编辑器 |
文件加载方式 | 一次性全部读入内存 | 按需读取 | 按需读取(大文件更省内存) |
适合文件大小 | 小文件(几十行) | 大文件 | 大文件(包括 GB 级) |
是否适合管道输入 | 可以 | 可以 | 可以 |
退出方式 | 自动结束 | 按 q 退出 | 按 q 退出 |
- head、tail:查看文件开头,结尾内容(默认10行)。tail -f 文件名可实时监控日志输出。
- find:搜索文件。
- 按文件名搜索
参数 | 作用 | 示例 |
-name | 精确匹配文件名(区分大小写) | find . -name "test.txt" |
-iname | 忽略大小写匹配 | find . -iname "*.jpg" |
-regex | 使用正则表达式匹配完整路径 | find . -regex ".*\.txt$" |
- 按文件类型搜索
参数 | 类型 | 示例 |
-type f | 普通文件 | find . -type f |
-type d | 目录 | find . -type d |
-type l | 符号链接 | find . -type l |
-type b | 块设备文件 | find /dev -type b |
-type c | 字符设备文件 | find /dev -type c |
- grep:搜索文件内容中的文本模式。
参数 | 作用 | 示例 |
-i | 忽略大小写 | grep -i "error" file.txt |
-v | 反向匹配(显示不包含模式的行) | grep -v "#" config.conf(过滤注释行) |
-n | 显示行号 | grep -n "error" app.log |
-c | 统计匹配行数 | grep -c "error" app.log |
-r / -R | 递归搜索目录 | grep -r "TODO" ./src/ |
-l | 只输出匹配的文件名 | grep -l "error" *.log |
-L | 只输出不匹配的文件名 | grep -L "SUCCESS" *.log |
-o | 只输出匹配的部分 | grep -o "[0-9]\{3\}" |
-A N | 显示匹配行及其后 N 行(After) | grep -A 5 "error" app.log |
-B N | 显示匹配行及其前 N 行(Before) | grep -B 5 "error" app.log |
-C N | 显示匹配行及前后各 N 行(Context) | grep -C 3 "error" app.log |
-e | 指定多个匹配模式 | grep -e "error" -e "warning" app.log |
-f | 从文件读取匹配模式 | grep -f patterns.txt app.log |
-E | 扩展正则表达式(同 egrep) | grep -E "error|fatal" app.log |
-F | 固定字符串匹配(同 fgrep),不解析正则 | grep -F ".*" file.txt |
- clear:清除终端屏幕上的所有内容,将光标移动到左上角。
- which:查找命令位置。
-a:显示所有匹配的路径(可能有多个版本)。示例:which -a python
- sed:文本替换、删除、插入。
- 核心语法:sed [选项] '动作' 文件名
- 最常用场景:
场景 | 命令 |
替换文本 | sed 's/旧/新/g' file.txt |
直接修改文件 | sed -i 's/旧/新/g' file.txt |
删除行 | sed '/关键词/d' file.txt |
删除空行 | sed '/^$/d' file.txt |
打印指定行 | sed -n '5,10p' file.txt |
插入行 | sed '3i\插入内容' file.txt |
- 核心参数
参数 | 作用 |
-i | 直接修改文件(不输出到屏幕) |
-n | 取消默认输出,配合 p 只打印匹配行 |
-e | 执行多个 sed 命令 |
-r / -E | 使用扩展正则表达式 |
- 常用示例
- 替换文件中的所有 foo 为 bar(输出到屏幕,不改文件)
sed 's/foo/bar/g' file.txt
- 直接修改文件
sed -i 's/foo/bar/g' file.txt
- 替换行首的 # 注释
sed -i 's/^#//' config.conf
- 删除包含 "debug" 的行
sed '/debug/d' app.log
- 删除空行
sed '/^$/d' file.txt
- 打印第 5 到第 10 行
sed -n '5,10p' file.txt
- 在第 3 行后面插入一行
sed '3i\new line' file.txt
- 替换指定第 2 行中的内容
sed '2s/old/new/' file.txt
- 组合多个操作
sed -e 's/foo/bar/g' -e '/^$/d' file.txt
- awk:字段提取、计算、格式化报表。
- 核心语法:awk '模式 { 动作 }' 文件名
- 核心概念:
$0:整行内容
$1:第 1 列
$2:第 2 列
$NF:最后一列
NR:当前行号
NF:当前行的字段数(列数)
FS:字段分隔符(默认空格/制表符)
- 最常用场景
场景 | 命令 |
打印指定列 | awk '{print $1, $3}' file.txt |
指定分隔符 | awk -F',' '{print $2}' data.csv |
条件过滤 | awk '$3 > 100 {print $0}' file.txt |
统计行数 | awk 'END {print NR}' file.txt |
求和 | awk '{sum += $1} END {print sum}' file.txt |
格式化输出 | awk '{printf "%-10s %s\n", $1, $2}' file.txt |
三、小技巧
- 管道符 |:将前一个命令的输出,作为后一个命令的输入。这是组合命令 的神器。
history | grep "ssh" # 在命令历史中搜索ssh相关记录
- 重定向:
>:覆盖写入文件(如 echo "hello" > file.txt)。
>>:追加到文件末尾。
- 快捷键:
Tab:自动补全路径或命令(救命技能)。
Ctrl + C:终止当前运行的程序。
Ctrl + D:退出当前终端。
Ctrl + R:逆向搜索历史命令(输入关键词就能找到)。
- 后台运行:在命令后加 & 可放入后台,如 python script.py &。用 jobs 查看后台任务,用 fg 调回前台。