【Linux】基础指令全攻略:从目录树、文件操作到权限管理,一篇打通命令行底层逻辑
🔥本文定位:面向刚接触 Linux 的同学,从“为什么要使用命令行”讲起,系统梳理目录与路径、文件操作、文本检索、压缩归档、重定向与管道、权限管理等核心知识。
💡学习目标:不仅会敲命令,还能理解命令背后的目录树、标准流和权限模型,建立后续学习 Linux 系统编程的底层认知。
文章目录
- 前言
- 一、Linux 与 Shell:先搞懂命令是怎么执行的
- 二、Linux 目录树与路径
- 三、文件与目录操作:从查看到删除
- 四、文本查看与搜索:日志排查必备
- 五、压缩归档与系统辅助命令
- 六、重定向与管道:让命令组合起来
- 七、Linux 权限管理:真正理解 rwx
- 八、综合实战:搭建一个安全的日志分析目录
- 九、核心知识点与避坑指南
- 总结
前言
刚接触 Linux 时,很多人会陷入一个误区:把ls、cd、mkdir、grep当成英语单词一样死记。
但真正决定你能否学好 Linux 的,并不是记住了多少命令,而是有没有建立三条主线:
- 目录树解决“文件在哪里”;
- 标准输入输出解决“数据从哪里来、到哪里去”;
- 权限模型解决“谁能对文件做什么”。
当这三条主线打通后,新的 Linux 命令只是完成不同任务的工具,而不再是一堆零散知识点。
本文所有示例建议在普通用户的测试目录中执行:
mkdir-p~/linux-command-labcd~/linux-command-labpwd⚠️安全提醒:不要在根目录、系统配置目录或重要业务目录中练习删除、覆盖和权限修改命令。尤其是
rm -rf、输出重定向>和递归chmod -R,执行前一定确认目标路径。
一、Linux 与 Shell:先搞懂命令是怎么执行的
1.1 Linux 到底是什么?
严格来说,Linux 指的是操作系统内核。日常所说的 Linux 系统,通常由下面几部分组成:
- Linux 内核;
- GNU 基础工具;
- Shell 命令解释器;
- 软件包管理器;
- 用户态程序与服务。
Ubuntu、Debian、RHEL、CentOS Stream、Fedora 等都是 Linux 发行版。它们共享相近的内核与命令行思想,但软件包管理、默认配置和发布节奏有所区别。
1.2 为什么服务器更偏爱命令行?
图形界面直观,但服务器管理更看重可重复、可远程、可自动化:
- 命令可以直接写入脚本;
- SSH 只需传输文本,远程操作开销小;
- 同一条命令可以批量处理成千上万个文件;
- 操作过程便于记录、复现和审计;
- 即使没有桌面环境,也能完成系统管理。
1.3 Shell 扮演什么角色?
Shell 是用户与操作系统之间的命令解释器。一个命令从输入到执行,大致经历:
用户输入命令 ↓ Shell 解析命令名、参数、通配符与重定向 ↓ 查找内建命令,或在 PATH 中寻找外部程序 ↓ 创建进程并执行程序 ↓ 等待结果,显示退出状态与输出图解说明:
cd、alias等内建命令由 Shell 自己执行;ls、grep等外部命令通常需要先在PATH中定位,再通过新进程启动。
常见终端提示符:
[alice@server ~]$command[root@server ~]# command$通常表示普通用户;#通常表示 root 用户;~表示当前用户的家目录。
1.4 使用 SSH 远程登录
sshusername@192.168.1.100如果 SSH 服务使用非默认端口:
ssh-p2222username@192.168.1.100💡终端快捷键:
Ctrl+C通常向前台进程发送中断信号,并不是复制。很多终端使用Ctrl+Shift+C/Ctrl+Shift+V,XShell 等客户端也可能使用Ctrl+Insert/Shift+Insert。
核心设计解读
Shell 并不是“命令本身”。例如ls通常是独立程序,cd则必须由 Shell 自己实现,因为切换目录需要改变 Shell 进程本身的工作目录。这也是“内建命令”和“外部命令”存在差异的根本原因。
二、Linux 目录树与路径
2.1 Linux 只有一棵目录树
Windows 常用C:、D:等盘符划分存储空间;Linux 从唯一的根目录/开始,把不同磁盘、分区和设备挂载到同一棵目录树中。
/ ├── bin ├── boot ├── dev ├── etc ├── home │ └── alice ├── proc ├── tmp ├── usr └── var记忆时不要孤立背目录名,可以按“程序、配置、用户、运行时、可变数据”五类建立整体认识。
普通文件通常位于目录树叶子位置,目录则可能继续包含子目录和文件。
2.2 常见目录的职责
| 目录 | 主要用途 | 初学者理解 |
|---|---|---|
/bin、/usr/bin | 常用命令和用户程序 | ls、cp等程序所在区域 |
/boot | 内核和启动相关文件 | 系统启动所需内容 |
/dev | 设备文件 | 磁盘、终端等设备的抽象 |
/etc | 系统与服务配置 | “配置中心” |
/home | 普通用户家目录 | 每个用户的个人空间 |
/root | root 用户家目录 | 不是根目录/ |
/proc | 进程与内核信息 | 基于内存的虚拟文件系统 |
/tmp | 临时文件 | 通常会定期清理 |
/usr | 用户程序、库和共享数据 | 大量软件资源 |
/var | 日志、缓存等可变数据 | 经常增长或变化的内容 |
⚠️
/root是 root 用户家目录,/才是整棵目录树的根,两者不要混淆。
2.3 绝对路径与相对路径
绝对路径从/开始,不依赖当前位置:
/home/alice/project/main.c相对路径以当前工作目录作为起点:
./main.c../project/main.c特殊路径:
| 写法 | 含义 |
|---|---|
. | 当前目录 |
.. | 上级目录 |
~ | 当前用户家目录 |
- | 上一次所在目录,仅用于部分命令语境,如cd - |
2.4 pwd 与 cd
pwd# 显示当前工作目录cd/home/alice# 使用绝对路径cd../project# 使用相对路径cd~# 返回家目录cd-# 在最近两个目录间切换核心设计解读
进程维护自己的当前工作目录。命令中出现相对路径时,内核会以该目录为基准解析。因此“文件创建到哪里”由进程当前工作目录决定,而不是由源代码或可执行文件存放位置决定。
三、文件与目录操作:从查看到删除
3.1 ls:不只是查看文件名
基本用法:
lsls/etclsfile.txt高频选项:
| 选项 | 作用 |
|---|---|
-a | 显示包含点开头隐藏项的全部内容 |
-l | 显示详细属性 |
-h | 与-l配合,以易读单位显示大小 |
-d | 显示目录自身,而不是目录内容 |
-i | 显示 inode 编号 |
-t | 按修改时间排序 |
-r | 反向排序 |
-R | 递归列出子目录 |
-F | 在名称后附加类型标记 |
组合使用:
ls-alhls-ltls-ld/etcls-ifile.txt一条典型的ls -l输出:
-rw-r--r-- 1 alice dev 4096 Aug 12 10:30 app.log它依次包含文件类型和权限、硬链接数、所有者、所属组、大小、修改时间与文件名。
3.2 touch:创建文件还是更新时间?
touchdemo.txtstatdemo.txt如果文件不存在,touch会创建空文件;如果已经存在,则默认更新访问时间和修改时间。
stat可以查看更完整的元数据:
statdemo.txt3.3 mkdir 与 rmdir
mkdirlogsmkdir-pproject/include/detailrmdirlogsmkdir -p会自动创建缺失的父目录;rmdir只能删除空目录。
3.4 cp:复制文件和目录
cpsource.txt backup.txtcpsource.txt backup/cp-rsrc/ backup/cp-isource.txt target.txtcp-aproject/ project-backup/常用选择:
-i:覆盖前询问;-r:递归复制目录;-a:归档模式,尽量保留属性、链接和目录结构。
3.5 mv:移动与重命名是同一个命令
mvold.txt new.txtmvreport.txt documents/mv-isource.txt target.txt当第二个参数是新的路径名时,mv完成重命名;当它是已存在的目录时,源文件被移动到该目录。
同一文件系统内的重命名通常只需修改目录项,不必搬运文件内容,因此往往很快。
3.6 rm:最危险也最常用
rmfile.txtrm-ifile.txtrm-rdirectory/rm -rf同时代表递归与强制,通常不会再次确认:
# 仅展示危险写法,不要在重要目录执行(这是命令行注释)rm-rfdirectory/🚨删除前四步检查
- 用
pwd确认当前位置;- 用
ls -ld target确认目标本身;- 确认变量不为空、通配符没有扩大范围;
- 优先使用
-i,重要数据先备份。
3.7 Shell 通配符
| 通配符 | 作用 | 示例 |
|---|---|---|
* | 匹配任意长度字符串 | *.c |
? | 匹配任意一个字符 | test?.txt |
[0-9] | 匹配一个数字 | log[0-9].txt |
[abc] | 匹配集合中的一个字符 | file[abc] |
ls*.ccp*.txt backup/lsfile[0-9].log通配符通常由 Shell 在执行命令前展开。程序收到的往往已经是展开后的文件名列表。
四、文本查看与搜索:日志排查必备
4.1 cat:适合短文件
catconfig.txtcat-nconfig.txt# 所有行编号cat-bconfig.txt# 仅非空行编号cat-sconfig.txt# 连续空行压缩为一行不要用cat直接刷超大文件,终端输出会非常混乱。大文件更适合less。
4.2 more 与 less
morelarge.logless-Nlarge.logless常用交互:
| 按键 | 作用 |
|---|---|
Space/PageDown | 向后翻页 |
PageUp | 向前翻页 |
/keyword | 向后搜索 |
n/N | 下一个 / 上一个匹配 |
g/G | 文件开头 / 结尾 |
q | 退出 |
4.3 head 与 tail
head-n20app.logtail-n20app.logtail-fapp.logtail -f会持续观察文件末尾新增内容,常用于跟踪服务日志。
4.4 grep:从文本中筛选内容
grep"ERROR"app.loggrep-n"ERROR"app.log# 显示行号grep-i"error"app.log# 忽略大小写grep-v"DEBUG"app.log# 反向选择grep-R"listen"./src# 递归搜索目录grep-E"ERROR|WARN"app.log# 扩展正则4.5 find:从目录树中定位文件
find.-name"*.c"find.-typed-name"build"find/var/log-typef-size+100Mfind.-typef-mtime-7-name:按名称;-type f/d:普通文件/目录;-size:按大小;-mtime:按修改天数。
⚠️ 将
find与删除动作组合前,先只打印结果并逐项确认,不要一开始就执行批量删除。
4.6 which、whereis 与 man
whichgccwhereisgccmanlsman2openman3printfman7signalwhich:根据PATH查找将执行的命令;whereis:查找程序、源码和手册的典型位置;man:阅读命令、系统调用、库函数和协议说明。
核心设计解读
grep解决“内容里有什么”,find解决“目录树上文件在哪里”,which解决“Shell 会执行哪个程序”。三者检索对象不同,不能相互替代。
五、压缩归档与系统辅助命令
5.1 tar:归档与压缩
创建 gzip 归档:
tar-czvfproject.tar.gz project/解包:
tar-xzvfproject.tar.gz常用参数记忆:
| 选项 | 含义 |
|---|---|
-c | 创建归档 |
-x | 解开归档 |
-t | 查看归档内容 |
-z | 使用 gzip |
-j | 使用 bzip2 |
-v | 显示过程 |
-f | 指定归档文件名 |
tar的核心职责是把多个文件归档为一个文件;gzip、bzip2 等算法负责压缩。日常命令经常把两步组合起来。
5.2 zip 与 unzip
zip-rproject.zip project/unzipproject.zipunzipproject.zip-doutput/5.3 date、cal 与 uname
datedate"+%F %T"caluname-auname-r5.4 whoami、id 与 alias
whoamiidaliasll='ls -alF'别名只影响当前 Shell 会话,若希望长期生效,需要写入对应 Shell 的配置文件并重新加载。
六、重定向与管道:让命令组合起来
6.1 三个标准流
程序启动时通常已经打开三个标准流:
| fd | 名称 | 默认对象 |
|---|---|---|
0 | 标准输入 stdin | 键盘 |
1 | 标准输出 stdout | 终端 |
2 | 标准错误 stderr | 终端 |
命令通常只管从标准输入读取、向标准输出或错误写入。至于这些描述符实际指向终端、文件还是管道,由 Shell 在程序启动前安排。
6.2 输出重定向
echo"first line">output.txtecho"second line">>output.txt>:覆盖写入,目标存在时会截断原内容;>>:追加写入。
6.3 输入与错误重定向
wc-l<output.txtcommand>normal.log2>error.logcommand>all.log2>&1第二条合并命令的顺序很关键:
- fd 1 先指向
all.log; - fd 2 再复制 fd 1 当前的指向。
6.4 管道
管道|把左侧命令的标准输出连接到右侧命令的标准输入:
ps-ef|grepnginxfind.-name"*.log"|wc-lgrep"ERROR"app.log|tail-n206.5 一个实用日志分析流水线
grep-E"ERROR|WARN"app.log\|tail-n100\|sort\|uniq-c\|sort-nr执行逻辑:
grep筛选错误和警告;tail保留最近 100 条;- 第一次
sort让相同内容相邻; uniq -c统计重复次数;- 第二次
sort -nr按次数降序排列。
核心设计解读
Unix 工具倾向于“只做好一件事”。grep不必内置统计、排序和分页,只要它能够正确读取标准输入、写出标准输出,就能通过管道与其他工具组合成复杂工作流。
七、Linux 权限管理:真正理解 rwx
7.1 谁在访问文件?
Linux 权限判断围绕三类身份:
- 文件所有者 user;
- 文件所属组 group;
- 其他用户 other。
ls-lapp -rwxr-xr--1alice dev4096Aug1210:30 app拆开:
- | rwx | r-x | r-- 类型 user group other7.2 文件类型
ls -l第一位常见含义:
| 字符 | 类型 |
|---|---|
- | 普通文件 |
d | 目录 |
l | 符号链接 |
c | 字符设备 |
b | 块设备 |
p | 管道 |
s | 套接字 |
使用file进一步识别:
fileappfilearchive.tar.gz7.3 rwx 的数值表示
| 权限 | 数值 |
|---|---|
r | 4 |
w | 2 |
x | 1 |
754的含义:
7 = 4 + 2 + 1 = rwx 5 = 4 + 0 + 1 = r-x 4 = 4 + 0 + 0 = r--7.4 chmod:修改访问权限
符号方式:
chmodu+x script.shchmodg-w report.txtchmodo=r public.txtchmoda+r README.md数字方式:
chmod754script.shchmod640config.iniu/g/o/a:所有者/所属组/其他/全部;+/-/=:增加/移除/精确设置。
⚠️ 不要为了省事随意使用
chmod 777。它把文件写权限开放给所有用户,容易造成篡改、植入或误删。正确做法是遵循最小权限原则。
7.5 chown 与 chgrp
chownalice file.txtchownalice:dev file.txtchgrpdev file.txt修改所有者通常需要 root 或相应能力;文件所有者一般可以在自己所属的组范围内按系统规则修改所属组。
7.6 目录权限为什么最容易出错?
同一个权限,对普通文件和目录含义不同:
| 权限 | 普通文件 | 目录 |
|---|---|---|
r | 读取内容 | 列出目录项名称 |
w | 修改内容 | 创建、删除、重命名目录项 |
x | 执行文件 | 进入/穿越目录并访问对象 |
最关键的结论:
删除文件修改的是父目录里的目录项。因此用户能否删除文件,核心看父目录的
w + x权限,而不是只看文件自身有没有w。
7.7 umask:默认权限从哪里来?
新建普通文件的基础权限通常按0666计算,目录按0777计算,再屏蔽umask中设置的位:
实际权限 = 基础权限 & (~umask)查看:
umask当umask为0022:
普通文件:0666 & ~0022 = 0644 目录: 0777 & ~0022 = 0755普通文件默认不带执行权限,是为了避免任意新文件直接成为可执行程序。
7.8 粘滞位:共享目录中的删除保护
ls-ld/tmp drwxrwxrwt... /tmp末尾的t是粘滞位。即使多人都有目录写权限,通常也只有文件所有者、目录所有者或 root 能删除对应文件。
设置:
chmod+t shared/八、综合实战:搭建一个安全的日志分析目录
下面把目录、文件、权限、重定向与管道串起来。
这套流程体现了 Linux 命令行最重要的组合思想:每个命令只负责一个小步骤,使用管道和重定向把它们连接成可重复执行的工作流。
8.1 创建实验目录
mkdir-p~/linux-command-lab/{logs,backup,reports}cd~/linux-command-lab tree如果没有tree:
find.-maxdepth2-print8.2 生成模拟日志
cat>logs/app.log<<'LOG' 2026-08-12 09:00:01 INFO server started 2026-08-12 09:01:12 WARN cache miss 2026-08-12 09:02:33 ERROR database timeout 2026-08-12 09:03:08 INFO retry success 2026-08-12 09:05:45 ERROR database timeout LOG8.3 分析错误并生成报告
grep-n"ERROR"logs/app.log>reports/errors.txtwc-lreports/errors.txtcatreports/errors.txt统计错误类型:
grep"ERROR"logs/app.log\|cut-d' '-f4-\|sort\|uniq-c\|sort-nr\>reports/error-summary.txt8.4 打包备份
tar-czvfbackup/logs-$(date+%F).tar.gz logs/ reports/tar-tzvfbackup/logs-$(date+%F).tar.gz8.5 设置合理权限
chmod750~/linux-command-labchmod750logs backup reportschmod640logs/app.logchmod640reports/*.txt验证:
ls-ld~/linux-command-lab logs backup reportsls-llogs reports实战设计解读
- 目录
750:所有者完全控制,所属组可进入并读取,其他用户无权访问; - 文件
640:所有者可读写,所属组只读,其他用户无权访问; - 报告通过管道生成,过程可重复执行;
- 归档文件加入日期,避免每天直接覆盖同一份备份。
九、核心知识点与避坑指南
9.1 为什么执行当前目录程序必须写 ./app?
Shell 只会在PATH指定目录中搜索外部程序,当前目录通常不在其中:
echo"$PATH"whichlsls-l./app ./app不建议随意把.放到PATH最前面,否则当前目录中的同名程序可能抢先于系统命令执行。
9.2 为什么目录有 r 权限却进不去?
因为目录的r只允许读取目录项名称,进入和穿越目录需要x:
- 有
r无x:可能看到名称,却无法正常访问对象; - 有
x无r:知道准确名称时可能访问,但不能正常列出目录; - 创建和删除目录项通常还需要
w + x。
9.3 > 为什么会让文件内容消失?
>使用覆盖/截断语义。Shell 在启动命令前就可能已经打开并清空目标文件,因此下面这种写法会先把文件截断:
# 错误示例:不要这样原地过滤(这是命令行注释)grep"ERROR"app.log>app.log正确做法是先写临时文件,验证后再替换:
grep"ERROR"app.log>app.log.tmpmvapp.log.tmp app.log9.4 为什么 rm 删除后通常很难恢复?
rm删除的是文件名与 inode 的关联,不会放进桌面回收站。后续磁盘写入可能覆盖原数据块。重要数据应依靠权限、备份、版本控制和快照保护,而不是依赖事后恢复。
9.5 find 和通配符有什么区别?
ls*.logfind.-name"*.log"*.log由 Shell 在当前路径层级展开;find主动遍历目录树,可组合类型、大小、时间等条件;- 在
find -name中给模式加引号,可以防止 Shell 提前展开。
9.6 sudo 不是“让所有命令都能执行”的开关
sudo根据配置以其他身份执行被授权命令。它不是权限问题的万能修复方式。执行前应理解目标、影响范围和命令本身,尤其不要给来源不明的脚本直接加sudo。
9.7 man 手册章节怎么选?
| 章节 | 典型内容 |
|---|---|
| 1 | 普通用户命令 |
| 2 | 系统调用 |
| 3 | C 库函数 |
| 5 | 配置文件格式 |
| 7 | 协议、约定和概念 |
| 8 | 系统管理命令 |
man1printfman3printf同名命令和库函数可以位于不同章节,指定章节能避免查错对象。
总结
这篇文章真正需要记住的不是几十条命令,而是 Linux 命令行背后的四层逻辑:
目录树:使用路径定位对象 ↓ 命令工具:查看、创建、复制、移动、检索对象 ↓ 标准流:使用重定向与管道组合数据处理流程 ↓ 权限模型:决定不同身份可以进行哪些操作当你能解释下面几个问题时,说明 Linux 基础已经真正入门:
- 为什么相对路径依赖当前工作目录?
- 为什么
cd必须是 Shell 内建命令? - 为什么
grep与find不能互相替代? - 为什么管道能把多个简单命令组合成复杂任务?
- 为什么删除文件主要取决于父目录权限?
- 为什么普通文件默认通常没有执行权限?
写在最后
🌱 Linux 学习最有效的方式不是“看完”,而是边看边在测试目录中验证。
如果这篇文章帮助你打通了 Linux 基础指令:
- ⭐收藏:需要查命令和权限时可以快速回来;
- ❤️点赞:让更多正在入门 Linux 的同学看到;
- 💬评论:留下你遇到过最难理解的 Linux 命令或权限问题;
- 👀关注:后续继续深入进程、文件 I/O、文件系统与网络编程。
技术成长没有捷径,但每一次在终端里亲手验证,都会让抽象概念变得更清晰。