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.log
echo "epoch 100" >> train.log
持续把新的 epoch loss 追加到日志尾部
< 输入重定向 文件传给命令读 文件 → 命令
命令的 stdin 从文件来
wc < data.txt
sort < 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=4w=2x=1”,组合相加即可。 快速套路

需求 字符写法 数字写法
脚本要给所有人跑 chmod a+x script.shchmod +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]' 找小数

注意正则特殊字符脱义
想真正匹配星号 * 要写 \*,或者用正则需加 -Eegrep.

扩展工具链

工具 何时用 例子
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  # 这也是注释

# 多行注释技巧(实际上是用空命令)
: '
这是多行注释
可以写很多说明
'

  1. & → 后台跑
  2. > → 覆盖写,>> → 追加写
  3. 2>&1 → 错误也进文件
  4. | → 管道传数据
  5. && → 成功才继续,|| → 失败才执行
  6. $() → 命令变文字
  7. {} → 一组或序列

文件权限与用户管理

1. 为什么需要权限?

  • 多用户系统:Linux设计用于多人同时使用
  • 安全性:防止用户误删系统文件或他人文件
  • 协作:课题组共享文件时需要控制访问权限

2. 权限三要素

每个文件/目录都有三组权限:

-rwxr-xr--  1 mzt2006 mzt2006  4096 Jan 10 10:30 my_script.sh
↑↑↑↑↑↑↑↑↑
└── 权限位

分解:

-        rwx       r-x       r--
类型    所有者权限  组权限    其他人权限
  • 类型-=普通文件,d=目录,l=链接
  • 权限字符
  • r = 读 (read) = 4
  • w = 写 (write) = 2
  • x = 执行 (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