📚前言
📒FDE系列内容总纲:
【大纲】FDE 前沿部署工程师学习系列教程-CSDN博客
🚄前置课程列表:
见文档结尾附录。
🚀阶段2·Day 36:Linux 入门与文件操作 — 扔掉鼠标的第一天
FDE 学习系列教程 · 第二阶段 · 第 4 周 · Day 1预计时长:2.5 小时 | 难度:★★☆☆☆ | 前置知识:Python 环境、FastAPI 基本操作
📌一句话目标:在 Windows 上用 WSL2 装出一个 Ubuntu,理解 Linux 文件系统,掌握 15+ 个文件操作命令,能在命令行里自如地"走来走去、翻箱倒柜"。
🧑🤝🧑 开场:客户的服务器没有桌面
兄弟,前三周你都在 Windows 上写代码——有资源管理器、有 VS Code 图形界面、双击就能装东西。
但你到客户现场,运维扔给你的通常是这样一串东西:
ssh fde@10.20.30.40 密码:********黑底白字一个终端,没有桌面、没有图标、没有鼠标指针。客户的服务器 90% 以上跑的是 Linux。你要做的一切——看日志、改配置、重启服务、备份数据——全靠敲命令。
听着像退回原始社会?恰恰相反,命令行是"老司机的高速通道":
在几百个日志文件里搜"ERROR":一条命令 3 秒
鼠标点开每个文件 Ctrl+F:半小时
给 100 台设备的配置文件批量改一个 IP:一条命令
手动改:改到怀疑人生
今天我们不折腾真服务器,先在你自己的 Windows 里白嫖一个 Linux——用 WSL2 装个 Ubuntu,零成本、零风险,练坏了删掉重装就行。
相关参考文档:【基础】Windows开发设置入门8:Windows 子系统 (WSL)操作入门_windows子系统-CSDN博客
📖 一、WSL2 是个啥?先搞懂再装
WSL 全称Windows Subsystem for Linux(Windows 里的 Linux 子系统)。微软官方做的兼容层,让你在 Windows 里直接跑一个真正的 Linux,不用装虚拟机、不用双系统。
┌────────────────────────────────────────────┐ │ 你的 Windows 电脑 │ │ │ │ ┌──────────────┐ ┌──────────────────┐ │ │ │ VS Code │ │ 浏览器/微信... │ │ │ │ 浏览器 │ │ │ │ │ └──────────────┘ └──────────────────┘ │ │ │ │ ┌──────────────────────────────────────┐ │ │ │ WSL2(真正的 Ubuntu Linux 内核) │ │ │ │ ┌────────┐ ┌──────┐ ┌──────────┐ │ │ │ │ │ bash │ │ python│ │ 文件系统 │ │ │ │ │ └────────┘ └──────┘ └──────────┘ │ │ │ └──────────────────────────────────────┘ │ └────────────────────────────────────────────┘ Windows 和 WSL 还能互相串门: · WSL 里访问 Windows 的 C 盘:/mnt/c/ · Windows 资源管理器访问 WSL 文件:\\wsl$ 或 \\wsl.localhost💡 为什么选 WSL2 而不是虚拟机?虚拟机要给 Linux 分固定内存、启动要等一两分钟;WSL2 轻量、秒开、和 Windows 共享文件,专门给开发者准备的。
🖥️ 二、安装 WSL2 + Ubuntu
步骤 1:以管理员身份打开 PowerShell
按Win 键,输入powershell,在 "Windows PowerShell" 上右键 → 以管理员身份运行。弹出蓝底窗口。
步骤 2:一条命令安装
wsl --install这条命令会自动帮你:启用 WSL 功能 → 下载 WSL2 内核 → 安装默认的Ubuntu发行版。
等待下载完成,然后重启电脑。
⚠️ 常见报错处理:
提示"虚拟化未启用":重启进 BIOS(开机狂按 F2/Del/F10,看品牌),找到
Intel VT-x或AMD-V/SVM选项设为 Enabled提示需要更新 WSL 内核:按提示去微软商店搜 "Windows Subsystem for Linux" 更新,或执行
wsl --update想装指定版本:
wsl --install -d Ubuntu-22.04
步骤 3:第一次启动 Ubuntu
重启后,开始菜单里会出现一个新应用Ubuntu,点开它。第一次启动会等一两分钟初始化,然后让你创建 Linux 用户名和密码:
Installing, this may take a few minutes... Please create a default UNIX user account. Enter new UNIX username: fde New password: Retype new password: passwd: password updated successfully用户名建议填
fde(本教程都按这个写)密码输入时屏幕不显示任何字符,连星号都没有——这是 Linux 的正常设计,不是键盘坏了,盲打完回车即可
这个密码是你在 Linux 里的"管理员密码",后面用
sudo时要输,记住它
看到下面这个提示符,说明你正式进入 Linux 了:
fde@DESKTOP-ABC123:~$ └┬┘ └─────┬──────┘ └┬┘ │ │ └─ 当前目录(~ = 家目录 /home/fde) │ └─ 主机名 └─ 你的用户名步骤 4:验证三件套
whoami # 我是谁 → fde pwd # 我在哪 → /home/fde uname -a # 系统信息 → Linux ... x86_64 ... Ubuntu ...再顺手更新一下软件源(相当于手机的"应用商店刷新列表"):
sudo apt update && sudo apt upgrade -y📢解说:
| 部分 | 含义 |
|---|---|
sudo | 以管理员(root)权限执行后面的命令,第一次会让你输刚才设的密码。以后看到命令前面带sudo,心里默念"管理员模式"即可。 |
apt | Debian/Ubuntu 的包管理工具 |
update | 更新软件源索引(不是更新软件本身!) |
apt update做什么?
去
/etc/apt/sources.list及sources.list.d/里配置的软件仓库下载最新的软件包清单。这份清单记录了"每个软件当前有哪些版本、从哪里下载"。
它不安装、不升级任何软件,只是刷新"目录信息",让你知道有哪些新版本可用。
💡 类比:相当于刷新应用商店的商品目录,但还没下载安装任何东西。
连接符:&&
表示逻辑与:只有前一条命令成功执行(返回 0),才会执行后一条。
若
apt update失败(比如网络问题),后面的upgrade就不会执行,避免在信息过期的情况下盲目升级。
| 部分 | 含义 |
|---|---|
sudo | 同样需要管理员权限 |
apt upgrade | 升级已安装的软件包到最新版本 |
-y | 对所有询问自动回答yes,无需手动确认 |
apt upgrade做什么?
根据刚才
update拿到的最新清单,把系统里已安装的软件升级到新版本。它不会删除已有软件包,也不会安装新依赖来满足升级(这是它和
dist-upgrade/full-upgrade的区别)。
-y的作用:
正常情况下升级会提示
Do you want to continue? [Y/n],需要手动敲y。加了
-y就自动确认,适合脚本、自动化、远程无人值守场景。
💡VS Code 联动(强烈推荐):在 VS Code 扩展商店装一个WSL扩展(微软官方,下载量最高那个)。装好后在 Ubuntu 终端里
cd ~/fde_project然后敲code .,VS Code 就直接在 Linux 环境里打开了这个目录——终端、编辑器、调试全是 Linux 的,体验丝滑。
📖 三、Linux 文件系统:先认路,再走路
Linux 的目录结构和 Windows 完全不是一个思路。别慌,FDE 日常打交道的就下面这几个:
/ ← 根目录:一切的起点(相当于"此电脑") ├── home/fde/ (~) ← 你的家目录:你的文件都放这,等价于 C:\Users\你 ├── etc/ ← 系统配置文件(nginx.conf、各种 .conf 都在这) ├── var/ │ ├── log/ ← 日志!日志!日志!排障第一现场 │ └── lib/ ← 服务产生的数据(MySQL 数据默认在这) ├── tmp/ ← 临时文件,重启可能清空 ├── usr/ │ └── bin/ ← 系统命令的可执行文件(ls、cp 都在这) └── mnt/ ├── c/ ← Windows 的 C 盘挂载在这里 └── d/ ← D 盘Linux vs Windows 路径三大差异
对比 | Windows | Linux |
|---|---|---|
分隔符 | 反斜杠 | 正斜杠 |
盘符 | C: D: E: 多个盘 | 没有盘符,一切从 |
家目录 |
|
|
大小写 | 不敏感( | 严格敏感( |
路径里的特殊符号(高频,务必记牢)
~ 家目录 cd ~ → /home/fde . 当前目录 ./hello.sh → 当前目录下的 hello.sh .. 上一级目录 cd .. → 从 /home/fde 到 /home - 上一次所在目录 cd - → 在两个目录间反复横跳 / 根目录(开头时) cd / → 回到最顶层📌绝对路径 vs 相对路径:
绝对路径:从
/出发的完整地址,如/home/fde/project/main.py,在哪都能用相对路径:相对于"你当前所在目录",如
./data/a.csv、../config/x.yml判断技巧:开头是
/就是绝对路径,其余是相对路径。
🖥️ 四、导航四件套:pwd / ls / cd / find
正式开练。在 Ubuntu 终端里逐条敲,边敲边看输出,命令这东西看十遍不如手敲一遍。
# ① pwd:我现在站在哪个目录 pwd # /home/fde # ② ls:这个目录里有什么 ls # 普通列表(隐藏文件不显示) ls -l # 长格式:权限、大小、时间全显示 ls -a # all:连隐藏文件(以 . 开头的)也显示 ls -lh # human:文件大小显示成 K/M/G 而不是字节数 ls -lah # 三个参数组合:最常用,建议背下来 # ③ cd:换目录 cd /tmp # 绝对路径:去 /tmp pwd # /tmp cd ~ # 回家 cd /var/log # 去看系统日志目录 ls # 里面有 syslog、nginx/、mysql/ 等 cd - # 嗖地一下回到上一个目录(/tmp) cd .. # 回上一级:/tmp → / cd # 不带参数 = cd ~,直接回家ls -l输出逐列拆解(明天细讲权限,今天先混眼熟)
$ ls -lh -rw-r--r-- 1 fde fde 2.1K Sep 18 10:00 app.log drwxr-xr-x 2 fde fde 4.0K Sep 18 09:30 data └─┬──┘└┬┘ └┬┘ └┬┘ └┬┘ └────┬────┘ │ │ │ │ │ └─ 修改时间 │ │ │ │ └─ 文件大小(-h 后人类可读) │ │ │ └─ 所属组 │ │ └─ 所有者 │ └─ 硬链接数(现在忽略它) └─ 权限 + 类型(第一个字符:d=目录,-=普通文件,l=快捷方式)# ④ find:按条件找文件(FDE 找配置/找日志神器) find /tmp -name "*.txt" # 在 /tmp 下递归找所有 .txt find ~ -name "*.py" # 家目录下找所有 Python 文件 find ~ -maxdepth 2 -name "*.py" # 只往下找 2 层(太深的不翻) find ~ -name "*.log" -mtime -1 # 24 小时内被修改过的 .log find . -type d -name "data" # 只找名为 data 的目录(-type f 则只找文件)💡
find是 Linux 里最强大的查找命令,没有之一。参数组合极多,但 FDE 日常 80% 场景就是find 目录 -name "模式",先把这一招用熟。
🖥️ 五、增删改移:mkdir / touch / cp / mv / rm
cd ~ # ① mkdir:建目录 mkdir myproject # 建一个 mkdir -p a/b/c # -p 一口气建多层(父目录不存在也不报错) tree a 2>/dev/null || sudo apt install -y tree && tree a # a/ # └── b/ # └── c/ # ② touch:建空文件(主要用来快速创建文件) touch hello.txt ls -l hello.txt # 大小 0 # ③ echo + 重定向:写内容进文件 echo "第一行" > hello.txt # > 覆盖写入 echo "第二行" >> hello.txt # >> 追加写入(注意区别!) cat hello.txt # 看一下:两行都在 # 第一行 # 第二行 # ④ cp:复制 cp hello.txt hello_backup.txt # 复制文件 cp -r myproject myproject_copy # 复制目录必须加 -r(递归) # ⑤ mv:移动 / 重命名(Linux 里这俩是同一个命令) mv hello_backup.txt moved.txt # 重命名 mv moved.txt myproject/ # 移动到目录里 ls myproject/ # ⑥ rm:删除(⚠️ Linux 删除不进回收站!删了就没了!) rm moved.txt # 等等,moved.txt 已经在 myproject 里了 rm myproject/moved.txt # 这样才对 rm -r myproject_copy # 删目录要加 -r rm -rf a # -r 递归 + -f 不询问,目录非空也照删🚨 关于 rm 的红线警告
❌ 绝对绝对不要敲的命令: rm -rf / rm -rf /* sudo rm -rf / 含义:从根目录开始无差别强删整个系统。 没有回收站、没有确认、没有后悔药。 系统文件删坏 → 当场去世,只能重装。 ✅ 安全习惯: 1. 删之前先 ls 一眼你要删的路径对不对 ls myproject/ ← 先看看里面有啥 rm -r myproject/ ← 确认无误再删 2. 用 Tab 补全路径,别手敲长路径 3. 重要数据先备份再删 4. 生产服务器上慎用 -f,先用不带 -f 的看提示📌Tab 补全是你最好的朋友:敲命令或路径时按一下Tab 键,系统自动补全;连按两下,列出所有可能的开头。既能提速,又能防止路径敲错。从第一天就养成习惯。
🖥️ 六、查看文件:cat / head / tail / less / wc
排障时 90% 的时间在看文件——配置文件、日志文件、数据文件。
# 先造一个 20 行的练习文件 for i in $(seq 1 20); do echo "第 $i 行内容" >> sample.txt; done # ① cat:一次性打印整个文件(适合小文件) cat sample.txt cat -n sample.txt # -n 显示行号 # ② head:只看开头 head -3 sample.txt # 前 3 行 # 第 1 行内容 # 第 2 行内容 # 第 3 行内容 # ③ tail:只看结尾(看日志最新报错就靠它) tail -3 sample.txt # 最后 3 行 tail -f sample.txt # ⭐ follow:实时追踪新增内容 # 文件有新内容会立刻刷出来,Ctrl+C 退出 # FDE 排障黄金命令:tail -f /var/log/nginx/error.log # ④ less:大文件分页查看(几百 MB 的日志别用 cat,会刷屏到天荒地老) less sample.txt # less 里面的操作键: # 空格 / f 下一页 # b 上一页 # g 跳到文件开头 G 跳到文件末尾 # /关键词 向下搜索(n 下一个,N 上一个) # q 退出 # ⑤ wc:数行数/词数/字节数 wc -l sample.txt # 20 sample.txt(-l = lines 行数) wc -w sample.txt # -w = words 词数命令 | 适用场景 | 记忆点 |
|---|---|---|
| 小文件全看、拼接文件 | 小猫咪一口吞下 |
| 看文件开头 N 行 | 配置文件看头部 |
| 看文件结尾 N 行 | 日志看最新 |
| 实时追踪日志 | 排障第一神器 |
| 大文件翻页+搜索 | "少即是多",进得去出得来(q) |
| 数行数 | 统计错误条数 |
🖥️ 七、在 WSL 里部署你的 FastAPI 项目
学了这么多命令,立刻用起来——把第 2 周的 FastAPI 项目搬到 Linux 里跑。这一步会暴露 Windows/Linux 的两个经典差异。
# ① 建项目目录 mkdir -p ~/fde_project && cd ~/fde_project # ② Ubuntu 自带 Python3,确认一下 python3 --version # Python 3.10.x 或更高 # ③ 装 pip 和 venv 工具 sudo apt update sudo apt install -y python3-pip python3-venv # ④ 建虚拟环境(注意 Linux 的激活路径!) python3 -m venv venv source venv/bin/activate # ⭐ Linux 写法 # Windows 是:venv\Scripts\activate # 激活成功后提示符前面会出现 (venv) # ⑤ 装依赖 pip install fastapi uvicorn -i https://pypi.tuna.tsinghua.edu.cn/simple # ⑥ 写一个最小 main.py(用 nano 或直接 VS Code 的 code .) cat > main.py << 'EOF' from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/") def root(): return {"msg": "Hello from Linux!", "env": "WSL2 Ubuntu"} @app.get("/health") def health(): return {"status": "ok"} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000) EOF # ⑦ 跑起来 uvicorn main:app --reload --host 0.0.0.0 --port 8000新开一个 Ubuntu 终端窗口验证:
curl http://localhost:8000/ # {"msg":"Hello from Linux!","env":"WSL2 Ubuntu"} curl http://localhost:8000/health # {"status":"ok"}看到返回的 JSON,恭喜——你的 API 已经跑在 Linux 上了。在 Windows 浏览器里打开http://localhost:8000/docs同样能访问(WSL2 的端口和 Windows 是共享的)。
⚠️Windows → Linux 切换最容易踩的两个坑:
路径分隔符:
\→/虚拟环境激活:
venv\Scripts\activate→source venv/bin/activate另外 Ubuntu 里 pip 装的命令可能提示找不到,用
python3 -m pip install xxx或pip3更稳。
让命令停下来:Ctrl+C
uvicorn --reload会一直占着终端。在 Linux 里想中断前台运行的程序,按Ctrl + C(不是关窗口!)。这个操作今天会用很多次,记住它。
📖 八、不会命令怎么办?三个求助渠道
Linux 命令几百个,没人背得完,关键是会查:
# ① --help:快速看参数(最常用) ls --help # 内容多,配合 less: ls --help | less # ② man:完整说明书(manual) man ls # 空格翻页,/搜关键词,q 退出 # ③ which:某个命令到底装没装、在哪 which python3 # /usr/bin/python3 which nginx # 没输出就是没装💡 新手常见困惑:"参数前面什么时候一个横杠,什么时候两个?" 约定俗成:单字母缩写用一个横杠(
-l、-a),完整单词用两个(--all、--human-readable)。ls -lah和ls -l -a -h完全等价,单字母参数可以抱团。
📝 本课小结
类别 | 命令 | 一句话 |
|---|---|---|
环境 |
| 一键装 Ubuntu |
身份 |
| 我是谁 / 管理员模式 |
导航 |
| 我在哪 |
导航 |
| 看目录内容(最常用组合) |
导航 |
| 回家 / 上级 / 上一个位置 |
查找 |
| 按名字找文件 |
建目录 |
| 递归建多层 |
建文件 |
| 建空文件 / 写内容 |
复制 |
| 文件 / 目录 |
移动 |
| 移动和重命名是同一个 |
删除 |
| 文件 / 目录 / 强删(危险) |
查看 |
| 全文 / 头 / 尾实时 / 分页 |
计数 |
| 数行数 |
求助 |
| 查用法 / 查手册 |
中断 |
| 停止前台程序 |
🧠 核心认知:Linux 世界"一切皆文件"——配置是文件、日志是文件、连硬件设备也表现为文件。所以文件操作命令是所有后续操作的地基。今天不用求多,先把ls / cd / find / cat / tail -f这五个练成肌肉记忆。
📋 课后练习
练习 1:用纯命令搭出项目目录树(约 20 分钟)
不允许用 VS Code,只用终端命令建出下面结构:
~/fde_lab/ ├── src/ │ ├── main.py │ └── utils/ │ └── helper.py ├── tests/ │ └── test_main.py ├── data/ │ └── sample.csv └── README.md提示:mkdir -p src/utils tests data一次搞定多层目录,空文件用touch。最后用tree ~/fde_lab(没装就sudo apt install tree)截图式验证。
练习 2:文件查看三连(约 15 分钟)
# 往 data/sample.csv 写 5 行设备数据 cat > ~/fde_lab/data/sample.csv << 'EOF' device,temperature 注塑机A1,65 注塑机A2,82 注塑机A3,91 冲压机B1,75 冲压机B2,88 EOF然后分别用cat、head -2、tail -2、wc -l查看,说出每种命令适合什么场景。
练习 3:find 大搜查(约 15 分钟)
用
find找出家目录下所有.py文件(应该能找到 main.py、helper.py、test_main.py 三个)找出
/var/log下所有.log文件用
find ~ -name "*.csv"确认 sample.csv 的绝对路径是什么
🔭 下节预告
今天你学会了在 Linux 里"走来走去"。明天上三个硬货:
权限机制——为什么你总看到
Permission denied?rwxr-xr--这串鬼画符到底啥意思?进程管理——服务卡死了怎么找到它、干掉它
文本三剑客 grep / awk / sed + 管道——在几万行日志里揪出报错的终极武器,这是 FDE 排障的看家本领
命令行的真正威力明天才开始显现,咱们接着干!
🌍附录:前置课程列表
阶段一:认知启蒙(AI 认知与 FDE 角色)
AI 认知
【FDE系列】阶段1Day 1:AI 层级关系 — 四个嵌套的圈-CSDN博客
【FDE系列】阶段1Day 2:AI 三阶段发展史 — 会认 → 会判断 → 会创造-CSDN博客
【FDE系列】阶段1Day 3:符号 AI vs 机器学习 — 两条路线的本质区别-CSDN博客
【FDE系列】阶段1Day 4:Transformer 的历史意义 — 2017 年的分水岭-CSDN博客
【FDE系列】阶段1Day 5:本周复习与自测 — 检验你的 AI 认知地基-CSDN博客
【FDE系列】阶段1Day 6:Transformer 架构 — 一张图纸盖出千千万万栋楼-CSDN博客
【FDE系列】阶段1Day 7:LLM 本质 — 文字接龙机器-CSDN博客
【FDE系列】阶段1Day 8:Token — 模型眼中的最小单位-CSDN博客
【FDE系列】阶段1Day 9:AI 幻觉 — 为什么会一本正经地胡说八道-CSDN博客
【FDE系列】阶段1Day 10:上下文窗口 — 模型的记忆力上限 + 本周复习-CSDN博客
【FDE系列】阶段1Day 11:Prompt — 给模型立规矩-CSDN博客
【FDE系列】阶段1Day 12:Memory — 让模型记住上下文
【FDE系列】阶段1Day 13:RAG — 给模型配图书管理员-CSDN博客
【FDE系列】阶段1Day 14:Tool Use — 让模型动手操作-CSDN博客
【FDE系列】阶段1Day 15:MCP — 统一的工具接口标准 + 第三周复习-CSDN博客
FDE 基础概念
【FDE系列】阶段1Day 16:什么是 FDE — 把 AI 变成客户结果的人-CSDN博客
【FDE系列】阶段1Day 17:FDE vs 传统实施 — 三大本质区别-CSDN博客
【FDE系列】阶段1Day 18:FDE 三重身份 + C6 胜任力模型-CSDN博客
【FDE系列】阶段1Day 19:七阶段行动路径 + 行业经验的价值-CSDN博客
【FDE系列】阶段1Day 20:阶段总结与产出物 — 第一阶段收官-CSDN博客
阶段二:技术地基(Python + FastAPI + SQL + Docker + API 集成)
Python基础
【FDE系列】阶段2:Day 21:Python 环境搭建 — 写出你的第一行代码-CSDN博客
【FDE系列】阶段2:Day 22:变量、数据类型、条件判断 — Python 的“记忆“和“判断“-CSDN博客
【FDE系列】阶段2:Day 23:循环与函数 — 让代码跑 100 遍、把逻辑打包复用-CSDN博客
【FDE系列】阶段2:Day 24:数据结构 — 列表、字典、集合、元组-CSDN博客
【FDE系列】阶段2:Day 25:文件读写与 JSON — 让程序连通外部数据(第一周收官)-CSDN博客
【FDE系列】阶段2:Day 26:模块化编程 — 把代码拆成“抽屉柜“-CSDN博客
【FDE系列】阶段2:Day 27:异常处理与日志 — 让程序“摔不烂、查得到“-CSDN博客
FastAPI入门到进阶
【FDE系列】阶段2:Day 28:FastAPI 入门 — 把你的函数变成 API 服务-CSDN博客
【FDE系列】阶段2:Day 29:FastAPI 进阶 — Pydantic 模型与完整 CRUD 实战-CSDN博客
【FDE系列】阶段2:Day 30:生产代码规范 — 测试、类型注解、配置管理(第二周收官)-CSDN博客
SQL基础
【FDE系列】阶段2:Day 31:SQL 基础 — 增删改查一把梭-CSDN博客
【FDE系列】阶段2:Day 32:多表查询 — JOIN 与聚合-CSDN博客
【FDE系列】阶段2:Day 33:进阶查询 — 窗口函数与 CTE-CSDN博客
【FDE系列】阶段2:Day 34:数据清洗 — 把脏数据捋干净-CSDN博客
【FDE系列】阶段2:Day 35:Python + SQL — 工单接入 MySQL + 本周收官-CSDN博客