Linux文件系统导航与操作
Linux文件系统
Linux文件系统结构
Linux没有C盘、D盘的概念,一切从 根目录 / 开始:
TEXT1/ <-- 根目录
├── home/ <-- 所有用户的家目录
│ └── mzt2006/ <-- 你的家目录(大本营)
├── etc/ <-- 系统配置文件
├── var/ <-- 经常变化的文件(日志等)
├── usr/ <-- 用户程序和数据
├── bin/ <-- 基本命令程序
└── mnt/ <-- 挂载点(你的Windows盘在这里)
├── c/ <-- C盘
└── d/ <-- D盘(如果有)
核心命令总结
| 命令 | 用途 | 示例 |
|---|---|---|
pwd |
显示当前位置 | pwd |
cd |
切换目录 | cd ~, cd .. |
ls |
列出文件 | ls -la |
mkdir |
创建目录 | mkdir project |
echo |
打印内容(可指定输出流) | echo "model: ResNet50" > ai.yaml |
touch |
创建空文件 | touch test.txt |
cat |
查看/创建文件 | cat > file.txt |
cp |
复制文件 | cp a.txt b.txt |
mv |
移动/重命名 | mv old.txt new.txt |
rm |
删除文件 | rm file.txt |
rmdir |
删除空目录 | rmdir empty_dir |
rm -r |
递归删除目录 | rm -r project |
grep |
按模式搜索文本的行选工具。 | grep "ERROR" *.log |
| 符号 | 官方名称 | 中文记忆口诀 | 数据方向 | 真实例子 (可直接敲) | AI/嵌入式里怎么用 |
|---|---|---|---|---|---|
> |
输出重定向(覆盖) | 传给文件(覆盖写) | 命令 → 文件 如果文件存在→清空后再写 |
ls > list.txt make > build.log |
把训练日志全部覆盖写入 train.log |
>> |
输出重定向(追加) | 传给文件(追加写) | 命令 → 文件 若存在→直接在末尾继续写 |
date >> build.logecho "epoch 100" >> train.log |
持续把新的 epoch loss 追加到日志尾部 |
< |
输入重定向 | 文件传给命令读 | 文件 → 命令 命令的 stdin 从文件来 |
wc < data.txtsort < names.txt |
把 5GB 数据集直接灌给 python 脚本分析 |
<< |
Here Document | 当场造多行文本 | 终端键盘 → 命令 读到指定结束标记为止 |
cat << EOF > config.yaml… EOF |
一键生成 Makefile / yaml / bash 启动脚本 |
ls命令
0. 最简形态:ls
- 只是横着列出名,不区分文件/目录/隐藏。
1. 二级命令
| Flag | 记忆 | 作用 |
|---|---|---|
| -l | long | 列详情:权限、大小、日期、所有者 |
| -a | all | 显示隐藏(.* 文件) |
| -h | human | 让 -l 里的字节变成 1K 20M 3G 人类易读 |
2. 进阶招式
| Flag | 用处示范 |
|---|---|
| -t | 按修改时间排序(最新在最前)ls -lth |
| -S | 按文件大小排序(最大在最前)ls -thS |
| -r | 把当前排序反转(旧/小文件置顶) |
| -R | 递归列出子目录里的全部内容 |
| -d | 只看目录本身信息,不展开内部文件 |
3. 分类高亮 & 更多
| Flag | 备注 |
|---|---|
| -F | 目录后加/、可执行文件后加 *** |
| --color=auto | 高亮:目录蓝色、脚本绿色 |
| -Z | 显示 SELinux 上下文(服务器才有) |
4. 组合
| 场景命令 | 作用一句话 |
|---|---|
ls -alh |
最常用:详细+隐藏+人类可读 |
ls -lth /var/log |
查看最新日志,时间排序 |
ls -lhSr |
找出 /tmp 里最大的垃圾 |
ls -d */ |
只列当前层的 目录 |
find . -type d | wc -l + 一行脚本 |
统计子目录数不超 1 秒 |
5. 实用的小脚本
alias ll='ls -alhF --color=auto' # 一劳永逸
chmod
chmod = change mode(改变文件/目录的“访问模式”)
chmod [选项] 权限表达式 目标/文件
↑ ↑
who(|ugo) +/-(±)或数字(=八进制)
字符方式
| 角色 | Abbrev | 含义 |
|---|---|---|
| u | user | 文件所有者 |
| g | group | 文件所属组 |
| o | others | 其它所有用户 |
| a | all(u+g+o) | 所有人 |
| 动作符 | 英文记忆 | 作用 |
|---|---|---|
| + | add | 添加权限 |
| – | remove | 去除权限 |
| = | set equal | 精确设定 |
| 权限字符 | 含义 | 数值 |
|---|---|---|
| r | read | 4 |
| w | write | 2 |
| x | execute | 1 |
口诀:“r=4,w=2,x=1”,组合相加即可。 快速套路
| 需求 | 字符写法 | 数字写法 |
|---|---|---|
| 脚本要给所有人跑 | chmod a+x script.sh 或 chmod +x |
chmod 755 script.sh |
| 私钥只能自己看 | chmod u=rw,go-rwx key.pem |
chmod 600 key.pem |
| 目录共享,大家都能看改 | chmod -R a+rw shared_dir/ 懒人做法 |
chmod -R 777 shared_dir/ 危险,慎用 |
| 数字记忆法小卡片(服务器三大经典值) |
- 644:普通文件,主人rw,别人r
- 755:可执行脚本,主人全权限,别人只能跑
- 777:生产环境彻底共享,防放进击的误删
常用选项
| Flag | 作用场景 | 示例 |
|---|---|---|
| -R | 递归改(追踪整个目录树) | chmod -R 640 /etc/nginx/ |
| -v | 显示每一步修改 | chmod -v 755 * |
| -c | 只报告发生的变化 | chmod -c g-w *.log |
实例
cd ~
mkdir demo && cd demo
touch message.txt
# 1. 剥夺所有权限 → 谁都打不开
chmod 000 message.txt
cat message.txt # → Permission denied
# 2. 恢复可读写给自己
chmod u+rw message.txt
cat message.txt # → (空)
echo "私有配置" > message.txt
# 3. 准备做成公共日志
chmod 644 message.txt
reset
# 忘掉所有细节,只想“默认正常”
chmod 644 myfile # 普通文件
chmod 755 mydir/ myscript # 目录/可执行脚本
grep
grep 就是 "Global Regular Expression Print" 按模式搜索文本的行选工具。 在文件或输出里快速找到目标行」。
| 场景 | 命令 | 口诀 |
|---|---|---|
| 搜当前目录所有 .log 中 ERROR | grep "ERROR" *.log |
grep 关键词 文件 |
| 递归整棵树查 ERROR | grep -r "ERROR" . |
grep -r 关键词 目录 |
| 搜的同时行号 / 颜色 / 忽略大小写 | grep -nR --color -i "error" |
-n 行号, -i 忽略大小写, --color 高亮 |
常用 flag 卡片
| Flag | 英文记忆 | 作用 | 例子 |
|---|---|---|---|
| -i | --ignore-case | 不区分大小写 | grep -i "error" log.txt |
| -r/-R | --recursive | 递归目录 | grep -r "epoch" src/ |
| -n | --line-number | 显示行号 | grep -n "limit" config.yaml |
| -v | invert-match | 反向过滤:显示不匹配的 | grep -v "^#" config.json |
| -w | word-regexp | 整词匹配 | grep -w "main" *.c |
| -l | files-with-matches | 只列出文件名 | grep -l "duplicate" *.py |
| -c | count | 统计命中行数 | grep -c "FAILED" test.log |
| -A 5 | --after-context=5 | 命中后 5 行 | grep -A 5 "ERROR" app.log |
| -B 5 | --before-context=5 | 命中前 5 行 | grep -B 3 "start training" train.log |
| -C 5 | --context=5 | 前后各 5 行 | grep -C 2 "accuracy" result.txt |
| --color=auto | 彩色高亮 | 爆红结果,alias prettify 必加 |
grep --color=auto "WARN" |
────────────────────
示例
① 找到 Python 文件中所有 TODO:
grep -rn "TODO" --include="*.py" .
② 只统计代码总行数(不含空行和注释):
find src/ -name "*.py" -exec cat {} \; | \
grep -v "^:space:*$" | \
grep -v "^:space:*#" | \
wc -l
③ 实时监控训练日志的新报错:
tail -f train.log | grep --line-buffered "ERROR"
④ 精确搜索整词 main(避免 maintainer):
grep -w 'main' main.go
⑤ 反向排除垃圾行:查看 nginx access.log 里不是 404 的请求
grep -v " 404 " /var/log/nginx/access.log
四、正则快速入门(grep 的核心)
grep 用的是 基础正则;加 -E 即扩展正则(同 egrep)。
| 符号 | 含义 | 例子 |
|---|---|---|
. |
任意 1 个字符 | h.l 匹配 hello, hill |
* |
前面字符出现 0 到多次 | ab* 匹配 a, ab, abb... |
^ |
开头 | grep "^#" 所有注释行 |
$ |
结尾 | grep "error$" 以 error 结尾行 |
[0-9] |
数字区间 | grep '[0-9]\+\.[0-9]' 找小数 |
注意正则特殊字符脱义:
想真正匹配星号 * 要写 \*,或者用正则需加 -E 或 egrep.
扩展工具链
| 工具 | 何时用 | 例子 |
|---|---|---|
| rg (ripgrep) | 超大 repo,速度 10 倍 | rg "function" src/ |
| ack | 自动忽略 .git/、.tmp | ack "pattern" |
| ag (the_silver_searcher) | IDE 级超快 | ag "TODO" |
Shell 符号总结
1. & —— 后台运行符、文件描述符复制符
后台运行符作用:让命令在后台运行,不占用当前终端。
# 前台运行(占用终端,直到结束)
python train.py
# 后台运行(立即返回终端提示符)
python train.py &
文件描述符复制符:类似于取地址的理解?详见2>&1
特点:
- 输出仍然会显示在当前终端(可能干扰你的工作)
- 终端关闭时,后台进程通常会被终止
- 可以用
jobs查看,fg调回前台
2. > 和 >> —— 输出重定向
区别:
echo "第一行" > file.txt # 覆盖写入(清空原内容)
echo "第二行" >> file.txt # 追加写入(保留原内容,添加在末尾)
常见用法:
# AI训练:保存日志
python train.py > training.log 2>&1 &
# 嵌入式:保存编译输出
make > build.log 2>&1
3. 2>&1 —— 错误重定向组合
这是最重要的组合之一!
拆解:
- 1 = 标准输出(stdout,正常输出)
- 2 = 标准错误(stderr,错误信息)
- > = 重定向
- &1 = “到标准输出的位置”
# 错误示范:错误信息仍显示在屏幕
python script.py > output.log
# 屏幕还会显示错误
# 正确示范:所有输出(正常+错误)都进文件
python script.py > output.log 2>&1
执行顺序:
1. > output.log:先把标准输出重定向到文件
2. 2>&1:再把标准错误重定向到标准输出的当前位置(即文件)
4. | —— 管道符
作用:把前一个命令的输出作为后一个命令的输入。
# 查看大文件时,先看前几行
cat large_file.txt | head -20
# 查找特定进程
ps aux | grep python
# 统计代码行数
find . -name "*.py" | xargs wc -l
管道链:
# AI:查看GPU使用,过滤出进程
nvidia-smi | grep python | awk '{print $5}'
# 系统:找出最耗内存的5个进程
ps aux | sort -rk4 | head -5
5. && 和 || —— 逻辑操作符
条件执行:
# &&:前一个成功才执行后一个
cd /path/to/project && make clean && make
# ||:前一个失败才执行后一个
python script.py || echo "脚本执行失败"
# 组合使用
make && echo "编译成功" || echo "编译失败"
实际应用:
# 嵌入式:编译成功才烧录
make && sudo flash_tool firmware.bin
# AI:环境检查
python -c "import torch" && echo "PyTorch已安装" || echo "请安装PyTorch"
6. ; —— 命令分隔符
作用:按顺序执行多个命令,不管前一个是否成功。
# 依次执行三个命令
cd /tmp; ls -l; pwd
# 与 && 的区别
false && echo "不会执行" # 前一个失败,后一个不执行
false ; echo "会执行" # 不管成败,都会执行
7. $() 和 ` ` —— 命令替换
作用:执行命令,并将其输出作为字符串使用。
# 两种写法等价
echo "今天是: $(date)"
echo "今天是: `date`"
# 实际应用
mkdir backup_$(date +%Y%m%d)
cp file.txt backup_$(date +%Y%m%d)/
# AI:用当前时间命名实验
python train.py --exp_name="exp_$(date +%H%M%S)"
8. {} —— 命令分组与大括号扩展
两种用途:
用途1:大括号扩展(生成序列)
# 生成数字序列
echo {1..10} # 1 2 3 ... 10
echo {01..10} # 01 02 ... 10
# 生成字母序列
echo {a..e} # a b c d e
# 组合扩展
mkdir dir_{1,2,3} # 创建 dir_1, dir_2, dir_3
touch file{1..3}.txt
用途2:命令分组
# 重定向整个组的输出
{ echo "开始训练"; python train.py; echo "训练结束"; } > log.txt 2>&1
9. * ? [] —— 通配符
文件名匹配:
ls *.py # 所有.py文件
ls *.py *.sh # 所有.py和.sh文件
ls data_2024*.csv # 以data_2024开头的csv文件
ls test?.txt # test1.txt, test2.txt等(单个字符)
ls [abc]*.txt # 以a、b或c开头的txt文件
ls [0-9]*.log # 以数字开头的log文件
ls [!0-9]*.log # 不以数字开头的log文件
10. ~ - —— 目录快捷方式
cd ~ # 回到家目录 (/home/用户名)
cd ~/projects # 家目录下的projects文件夹
cd - # 回到上一个目录(在两个目录间切换)
11. # —— 注释符
# 这是注释
python train.py # 这也是注释
# 多行注释技巧(实际上是用空命令)
: '
这是多行注释
可以写很多说明
'
总
&→ 后台跑>→ 覆盖写,>>→ 追加写2>&1→ 错误也进文件|→ 管道传数据&&→ 成功才继续,||→ 失败才执行$()→ 命令变文字{}→ 一组或序列
文件权限与用户管理
1. 为什么需要权限?
- 多用户系统:Linux设计用于多人同时使用
- 安全性:防止用户误删系统文件或他人文件
- 协作:课题组共享文件时需要控制访问权限
2. 权限三要素
每个文件/目录都有三组权限:
-rwxr-xr-- 1 mzt2006 mzt2006 4096 Jan 10 10:30 my_script.sh
↑↑↑↑↑↑↑↑↑
└── 权限位
分解:
- rwx r-x r--
类型 所有者权限 组权限 其他人权限
- 类型:
-=普通文件,d=目录,l=链接 - 权限字符:
r= 读 (read) = 4w= 写 (write) = 2x= 执行 (execute) = 1- 数字表示:
rwxr-xr--= 754
3. 作用
- 共享数据集时控制谁可以读/写
- 编译出的程序需要可执行权限
- Web服务(如Jupyter)需要正确权限才能运行
实践
查看和理解权限
# 1. 回到家目录
cd ~
# 2. 创建一个测试文件
echo "echo 'Hello Permissions!'" > test_script.sh
# 3. 查看详细信息
ls -l test_script.sh
# 4. 尝试执行(会失败!)
./test_script.sh
观察输出:
-rw-r--r-- 1 mzt2006 mzt2006 25 Jan 10 10:30 test_script.sh
- 没有
x(执行权限),所以无法运行
修改权限
# 1. 添加执行权限(三种方法)
chmod +x test_script.sh # 给所有人添加执行权限
# 或
chmod 755 test_script.sh # rwxr-xr-x (数字法)
# 或
chmod u+x test_script.sh # 只给所有者(u)加执行
# 2. 再次查看
ls -l test_script.sh
# 3. 现在可以执行了
./test_script.sh
目录权限
# 1. 创建测试目录
mkdir shared_project
cd shared_project
# 2. 查看目录权限
ls -ld . # -d 表示查看目录本身,不是内容
# 3. 创建共享文件
echo "课题组共享数据" > shared_data.txt
# 4. 测试目录的x权限(进入权限)
chmod -x .. # 去掉上级目录的执行权限
cd .. # 尝试返回 - 会失败!
chmod +x .. # 恢复权限
cd shared_project
用户和组
# 1. 查看当前用户信息
whoami
id
# 2. 查看文件所有者
ls -l shared_data.txt
# 3. 创建新用户(需要sudo,WSL可能不支持,但了解概念)
# sudo useradd -m testuser # 实际服务器上可以
# 4. 修改文件所有者(需要sudo)
# sudo chown testuser shared_data.txt
特殊权限
# 1. 创建一个需要密码的脚本
cat > secret_script.sh << 'EOF'
#!/bin/bash
echo "正在处理敏感数据..."
cat /etc/passwd | head -3
EOF
chmod +x secret_script.sh
# 2. 添加SUID(Set User ID)概念说明
# 实际例子:passwd命令
ls -l /usr/bin/passwd
# 注意:有's'标志,允许普通用户修改/etc/passwd
权限数字表示法
记忆口诀:421
- 读 r = 4
- 写 w = 2
- 执行 x = 1
常见组合:
chmod 644 file.txt # rw-r--r-- (普通文件默认)
chmod 755 script.sh # rwxr-xr-x (可执行脚本)
chmod 600 key.pem # rw------- (私钥,仅自己可读)
chmod 777 directory # rwxrwxrwx (危险!谁都能删改)
快速计算:
所有者:rwx = 4+2+1 = 7
组:r-x = 4+0+1 = 5
其他人:r-- = 4+0+0 = 4
→ 754