刚开始使用 Linux 时,最容易陷入两个极端:要么背下一长串命令却不知道什么时候用,要么看到终端就担心误删文件。更可靠的学习方式,是先明确自己要完成的任务,再理解命令会读取什么、修改什么,以及出错后是否容易恢复。
本文围绕日常开发中的真实场景展开。每组命令都会说明用途、常用参数、示例和注意事项。示例默认在普通用户权限下执行;除非确实需要管理系统资源,否则不要随意加 sudo。
使用命令之前:先理解命令行
Linux 命令通常由三部分组成:
命令 [选项] [参数]例如:
ls -lah /var/logls是命令;-lah是三个短选项的组合;/var/log是要查看的目录。
选项并不都能自由组合,不同命令的同名选项也可能含义不同。遇到陌生命令时,应先查帮助,而不是凭经验猜测。
用 man 和 --help 查帮助
man 用于打开系统安装的手册页,适合查看完整语法、选项和相关文件;多数命令还支持更简短的 --help。
man lsls --help在 man 中可以按 / 搜索,按 n 跳到下一个匹配项,按 q 退出。某些精简系统没有预装手册页,此时可以先使用 --help,再查对应发行版或项目的官方文档。
路径、引号与 --
/etc/hosts是绝对路径,从根目录/开始。./scripts/build.sh是相对路径,从当前目录开始。..表示上一级目录,~表示当前用户的家目录。- 路径含空格时应使用引号,例如
cd "My Projects"。 - 文件名以
-开头时,可以用--结束选项解析,例如rm -- -draft.txt。
查看和切换目录
pwd:确认当前位置
pwd 输出当前工作目录的绝对路径。它几乎没有日常必需的参数,但在执行相对路径操作、批量处理或删除前非常重要。
pwd注意:终端提示符显示的路径可能经过缩写,脚本也可能改变工作目录;需要精确判断时,以 pwd 的结果为准。
ls:查看目录内容
ls 用于列出文件和目录。常用选项如下:
| 选项 | 作用 |
|---|---|
-l | 使用长格式,显示权限、所有者、大小和时间 |
-a | 包含以 . 开头的隐藏项 |
-h | 与 -l 配合,以易读单位显示大小 |
-t | 按修改时间排序 |
ls -lahls -lt /var/logls -l 的大小是文件自身大小,不等于目录内全部内容的总大小;查看目录占用应使用后文的 du。-d 可以让 ls 显示目录本身而不是列出目录内容,例如 ls -ld ./config。不要依赖 ls 输出做复杂脚本解析,文件名可以包含空格甚至换行。
cd:切换目录
cd 是 Shell 内建命令,用于改变当前工作目录。
cd /var/log # 进入绝对路径cd ../config # 从当前位置进入相对路径cd ~ # 回到家目录cd - # 回到上一次所在目录cd 没有输出通常表示成功。若提示 No such file or directory,先检查路径拼写、大小写和引号;Linux 文件名通常区分大小写。
创建、复制、移动和删除文件
mkdir:创建目录
mkdir 用于创建目录。-p 会同时创建缺失的父目录,并在目录已经存在时不报错;-m 可以在创建时指定权限。
mkdir logsmkdir -p build/output/assetsmkdir -m 750 private-data注意:mkdir -p 很方便,但路径写错时也会安静地创建一整条错误目录。创建后可以用 ls -ld <目录> 验证。
touch:创建空文件或更新时间
touch 常用于创建空文件;如果文件已经存在,它默认更新访问时间和修改时间。-c 表示文件不存在时不要创建。
touch README.mdtouch -c existing.log不要把 touch 理解为“只创建文件”。在依赖时间戳的构建流程中,对已有文件执行它可能触发重新构建。
cp:复制文件或目录
cp 用于复制内容。常用选项包括:
| 选项 | 作用 |
|---|---|
-r / -R | 递归复制目录 |
-a | 归档模式,尽量保留权限、时间和符号链接 |
-i | 覆盖前询问 |
-n | 不覆盖已有文件 |
-v | 显示正在处理的路径 |
cp config.example.yml config.ymlcp -a public/ backup/public/cp -iv report.md archive/report.md复制到目录时,末尾斜杠和目标是否存在会影响结果。处理重要目录前,先在测试目录验证结构;不要假设 cp -r source/ target/ 在所有目标状态下都生成同样的层级。
mv:移动或重命名
mv 可以移动文件,也可以在同一文件系统内重命名。-i 在覆盖前询问,-n 禁止覆盖,-v 显示操作过程。
mv draft.md article.mdmv -iv article.md archive/同一文件系统内移动通常很快,但跨文件系统移动实际会复制后再删除源文件。默认情况下,目标同名文件可能被覆盖;重要操作应使用 -i 或提前检查目标。
ln -s:创建符号链接
ln 创建链接,日常更常见的是使用 -s 创建符号链接。-n、-f 会影响已有目标,使用前要格外谨慎。
ln -s /opt/myapp/releases/2026-08 currentls -l current相对链接是相对于“链接所在目录”解析的,而不是相对于创建命令时的目录。删除符号链接本身不会删除它指向的目标,但在带递归选项的工具中仍应确认实际行为。
rm:删除文件和目录
rm 用于删除目录项。常用选项包括 -i(逐项确认)、-r(递归处理目录)、-f(忽略不存在的文件并取消大多数确认)和 -v(显示处理路径)。
rm -i old-report.mdrm -r -- obsolete-directory查看和搜索文本
cat 与 less:短文件和长文件
cat 将文件内容写到标准输出,适合短文件或管道输入;-n 可以显示行号。大文件更适合用 less,其 -N 选项显示行号。
cat -n package.jsonless -N /var/log/syslog在 less 中按 /error 搜索,按 n 查看下一处,按 q 退出。直接 cat 巨大日志会淹没终端,也可能造成明显的 I/O 和渲染开销。
head 与 tail:查看开头、结尾和持续日志
head 默认显示前 10 行,tail 默认显示后 10 行。二者都可以用 -n 指定行数;tail -f 会持续等待追加内容。
head -n 20 app.logtail -n 100 app.logtail -f app.logtail -f 适合临时观察日志,但不会自动帮你分析问题;结束跟随要按 Ctrl+C。日志轮转后是否继续跟踪取决于选项和实现,GNU tail -F 更适合按文件名重试跟踪。
grep:按内容筛选
grep 搜索文本行。常用选项有 -n(行号)、-i(忽略大小写)、-r/-R(递归)、-E(扩展正则)、-F(按普通字符串匹配)和 -v(反向筛选)。
grep -nF 'server.port=' application.propertiesgrep -Rni --exclude-dir=node_modules 'TODO' src/grep -E 'WARN|ERROR' app.log当关键词包含 .、[ 等正则字符,而你只想找字面文本时,优先使用 -F。递归搜索前限制目录,并排除依赖或构建产物,否则结果可能过多、速度也会明显下降。
find:按路径属性查找
find 可以按名称、类型、时间和大小遍历目录。常用条件包括 -type f、-type d、-name、-iname、-maxdepth 和 -mtime。
find . -maxdepth 3 -type f -name '*.md' -printfind logs -type f -name '*.log' -mtime +7 -print先只使用 -print 检查匹配结果,再考虑带 -delete 或 -exec 的修改操作。find 的条件顺序和逻辑运算会影响结果;不要在未查看结果时直接批量删除。
wc、sort 与 uniq:统计和整理文本
wc统计行、单词和字节;常用-l、-w、-c。sort排序文本;常用-n(数值)、-h(识别易读大小单位)、-r(逆序)、-u(排序并去重)。uniq处理相邻重复行;常用-c(计数)、-d(只显示重复项)。
wc -l access.logsort -n scores.txtsort users.txt | uniq -cuniq 只合并相邻的重复行,所以通常先 sort。这些工具默认受当前 locale 影响;脚本若要求稳定排序规则,应明确环境,例如 LC_ALL=C sort。
管道和重定向
管道 | 把左侧命令的标准输出交给右侧命令;> 覆盖文件,>> 追加文件,2> 重定向标准错误。示例中的 printf 按格式输出文本,%s 表示字符串占位,\n 表示换行;相比行为因实现而异的 echo,它更适合脚本生成确定格式的文本。
grep -F 'ERROR' app.log | tail -n 20printf '%s\n' 'server.port=8080' > application.propertiesprintf '%s\n' 'startup complete' >> app.logfind src -type f -name '*.ts' 2>find-errors.log理解 Linux 权限
ls -l 的第一列类似 -rwxr-x---:第一个字符表示类型,后面三组三位依次对应所有者、用户组和其他用户。
| 权限 | 文件上的含义 | 目录上的含义 |
|---|---|---|
r | 读取内容 | 列出目录项名称 |
w | 修改内容 | 创建、删除或重命名目录项 |
x | 执行文件 | 进入并访问目录中的项目 |
whoami 与 id:确认当前身份
whoami 输出当前有效用户名;id 显示用户 ID、主组和附加组。id -u 只输出 UID,id -g 只输出主组 GID。
whoamiidid -u权限问题不一定意味着需要 sudo,也可能是文件所有者、所属组、目录执行权限或挂载选项不正确。先用 id 和 ls -ld 找原因。
chmod:修改权限位
chmod 支持符号模式和数字模式。-R 会递归处理目录树,--reference 可以参考另一个文件的权限。
chmod u+x scripts/deploy.shchmod go-rwx secrets.envchmod 644 public.txtchmod 755 scripts数字模式中,读、写、执行分别是 4、2、1;每组三者相加得到所有者、组和其他用户的权限。755 不是“通用正确答案”:普通私密文件不应对所有人开放读取,配置文件也通常不需要执行权限。
chown:修改所有者和所属组
chown 接受 用户:组,-R 表示递归处理,--reference 可以复制参考文件的所有权。
sudo chown appuser:appgroup /srv/myapp/config.ymlsudo chown -R appuser:appgroup /srv/myapp/uploads更改系统路径通常需要管理员权限。递归 chown 可能破坏包管理器、容器卷或服务账户预期的所有权,因此必须限定到明确的应用目录。
sudo:以其他身份执行单条命令
sudo 默认以管理员身份执行命令,-u <用户> 可以指定其他用户,-l 查看当前被允许的命令。
sudo -lsudo systemctl status nginxsudo -u appuser id这里的 systemctl status nginx 只读取 nginx 服务状态,不会启动或停止服务。不要先进入长期 root Shell 再进行普通开发。sudo 不会让错误命令变正确,只会扩大它能影响的范围;运行前应完整检查命令和目标路径。
查看和管理进程
ps、pgrep 与 top:先找到进程
ps 展示进程快照;常见写法 ps aux 或 ps -ef 会列出更完整的信息。pgrep 按名称或属性查 PID,-a 同时显示命令行,-u 限定用户。top 动态刷新 CPU、内存和进程状态,-p 可以只观察指定 PID。
ps auxps -ef | grep '[n]ginx'pgrep -a nginxpgrep -u "$USER" -a javatop -p 12345grep '[n]ginx' 可以避免把 grep 自身显示为匹配结果,但脚本中更适合直接使用 pgrep。同名程序可能有多个进程,不能只看名称就结束全部进程。
jobs、bg 与 fg:管理当前 Shell 的任务
jobs 查看当前 Shell 启动的后台或暂停任务,-l 同时显示 PID;bg 让暂停任务在后台继续;fg 把任务带回前台。
jobs -lbg %1fg %1这里的 %1 是 Shell 任务编号,不是 PID。关闭终端后任务是否继续运行取决于 Shell、信号处理和启动方式;需要长期运行的服务应交给 systemd、容器编排或专用进程管理器。
kill:向进程发送信号
kill 的参数是 PID。默认发送 SIGTERM,允许程序清理资源后退出;-l 列出信号,-KILL 或 -9 发送无法被捕获的 SIGKILL。
kill -TERM 12345kill -l# 仅在进程无法正常退出且 PID 已再次确认时:kill -KILL 12345检查磁盘和内存
df:查看文件系统空间
df 报告已挂载文件系统的使用情况。-h 使用易读单位,-T 显示文件系统类型,指定路径时会定位该路径所在文件系统。
df -hdf -hT /df -h /var/lib文件已经删除但仍被进程打开时,df 的已用空间可能不会立即下降。df 反映文件系统整体,而不是某个目录的逐项大小。
du:统计目录占用
du 统计路径实际占用。-s 只显示汇总,-h 使用易读单位;GNU du 支持 --max-depth 控制目录层级。
du -sh ./builddu -h --max-depth=1 /var/log | sort -h扫描大目录可能耗时并产生 I/O。权限不足会导致部分路径无法统计;不要为了消除所有提示而直接对整个根目录使用 sudo du。
lsblk 与 free:设备和内存
lsblk 展示块设备及挂载关系,-f 增加文件系统信息;free 展示内存与 swap,-h 使用易读单位。
lsblk -ffree -hfree 中的 available 通常比单看 free 更能反映可供新程序使用的内存。lsblk 只读查看是安全的,但不要根据设备名猜测后直接执行格式化或分区命令。
排查网络问题
ip:查看地址和路由
ip 是现代 Linux 中管理网络对象的主要工具。ip addr 查看地址,ip route 查看路由,-brief 提供精简输出。
ip -brief addrip route本文只使用只读子命令。ip link set、ip addr add、ip route change 会直接修改网络状态,远程服务器上错误操作可能立刻断开连接。
ping:测试 ICMP 可达性
ping 发送 ICMP Echo 请求。-c 限制次数,-W 设置等待时间(具体单位和行为以系统实现为准)。
ping -c 4 1.1.1.1ping -c 4 example.com能 ping 通不代表 HTTP 服务正常,ping 不通也不一定代表主机离线,因为防火墙可能禁止 ICMP。分别测试 IP 和域名有助于区分网络连接与 DNS 问题。
curl:观察应用层请求
curl 可以发起 HTTP 等协议请求。-I 只请求响应头,-L 跟随重定向,-v 显示连接和协议细节,-o 写入文件,--fail-with-body 在 HTTP 错误状态下返回失败并保留响应正文。
curl -I https://example.comcurl -L -o release.tar.gz https://example.com/release.tar.gzcurl -v --fail-with-body https://api.example.com/health-v 可能显示请求头、Cookie 或认证信息,分享输出前要脱敏。不要把来源不明的网络响应直接通过管道交给 sh 或 bash 执行。
ss:查看监听端口和连接
ss 查看套接字。常用选项:-l 仅监听、-n 不解析名称、-t TCP、-u UDP、-p 显示进程信息。
ss -lntsudo ss -lntpss -lun普通用户可能看不到其他用户进程的完整信息。监听在 127.0.0.1 与监听在 0.0.0.0 的可访问范围不同,不能只看到端口号就断言外部可访问。
dig:检查 DNS 结果
dig 查询 DNS。+short 精简结果,@服务器 指定解析器,记录类型可以写 A、AAAA、CNAME、MX 等。
dig example.com Adig example.com AAAA +shortdig @1.1.1.1 example.com某些系统需要额外安装包含 dig 的软件包。不同解析器可能因缓存、地域和 DNS 策略返回不同结果;一次查询不能代表所有用户此刻看到的结果。
压缩、查看和解压归档
tar:打包目录
tar 把多个文件归档。常用操作字母:c 创建、t 列表、x 解包、f 指定文件;z 使用 gzip,J 使用 xz,C 在指定目录中操作。
tar -czf app-backup.tar.gz app/tar -tzf app-backup.tar.gzmkdir -p restoretar -xzf app-backup.tar.gz -C restore/先用 -t 查看归档结构,再解压到新建的空目录。来自不可信来源的归档可能包含异常路径、符号链接或覆盖目标,不应直接解压到项目根目录或系统目录。
gzip 与 gunzip:压缩单个数据流
gzip 默认压缩单个文件并用 .gz 替换原文件;-k 保留原文件,-d 解压,-c 写到标准输出。gunzip 等价于常见的 gzip -d 用法。
gzip -k access.loggunzip archived.log.gzgzip -dc archive.sql.gz | lessgzip 本身不保存目录结构,多文件目录通常先用 tar 打包。gunzip archived.log.gz 默认生成 archived.log 并移除压缩文件,如果目标已经存在通常会拒绝覆盖。解压前确认磁盘空间,压缩文件很小并不意味着解压结果也小。
zip 与 unzip:处理 ZIP 文件
zip -r 递归压缩目录,unzip -l 只列出内容,unzip -d 指定解压目录。
zip -r source.zip src/unzip -l source.zipunzip source.zip -d restore/默认覆盖策略可能因工具和交互环境不同而变化。自动化脚本要明确是否允许覆盖,陌生 ZIP 同样应先查看列表并解压到隔离目录。
把命令组合成实际工作流
场景一:持续观察错误日志
tail -f app.log | grep --line-buffered -E 'WARN|ERROR'这里 tail -f 持续产生新行,grep --line-buffered 尽快输出匹配结果。完成观察后按 Ctrl+C,不要把它当成正式监控系统。
场景二:排查磁盘空间
df -h /var/logdu -h --max-depth=1 /var/log 2>/dev/null | sort -h先用 df 判断文件系统是否真的接近满载,再用 du 缩小目录范围。两者明显不一致时,再考虑已删除但仍被进程占用的文件、挂载点或权限问题。
场景三:查找配置中的端口
find ./config -type f -name '*.yml' -printgrep -RFn --include='*.yml' 'server.port' ./config先确认搜索范围,再按普通字符串递归查找。这样比在整个家目录或根目录中无边界搜索更快,也更容易理解结果。
场景四:判断服务是否真正可用
ss -lntpcurl -v --fail-with-body http://127.0.0.1:8080/health监听端口只说明有进程绑定了套接字;应用是否健康还要通过协议层请求确认。若服务要被其他设备访问,还需检查绑定地址、容器端口映射、防火墙和网络路径。
操作前的安全检查清单
- 用
pwd确认当前目录,用ls或只读查询确认目标。 - 对含空格或通配符的路径使用正确引用;必要时用
--结束选项。 - 批量修改前先打印匹配结果,从一个样本开始验证。
- 优先使用可恢复操作,重要数据先确认备份确实能读取。
rm -r、chmod -R、chown -R和kill -KILL都应有明确理由。- 只在权限确实要求时使用
sudo,不要用更高权限掩盖路径或所有权错误。 - 阅读错误信息并检查退出状态,不要因为命令“没有输出”就假设业务结果正确。
真正熟练使用 Linux,不是记住最多的参数,而是能在执行前说明命令的输入、影响范围和失败后果。先观察、再缩小范围、最后修改,这套顺序比任何速查表都更值得形成习惯。
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 13 天
部分内容可能已过时