5308 字
27 分钟
Linux 常用命令指南:文件、权限、进程与网络

刚开始使用 Linux 时,最容易陷入两个极端:要么背下一长串命令却不知道什么时候用,要么看到终端就担心误删文件。更可靠的学习方式,是先明确自己要完成的任务,再理解命令会读取什么、修改什么,以及出错后是否容易恢复。

本文围绕日常开发中的真实场景展开。每组命令都会说明用途、常用参数、示例和注意事项。示例默认在普通用户权限下执行;除非确实需要管理系统资源,否则不要随意加 sudo。

使用命令之前:先理解命令行#

Linux 命令通常由三部分组成:

命令 [选项] [参数]

例如:

Terminal window
ls -lah /var/log
  • ls 是命令;
  • -lah 是三个短选项的组合;
  • /var/log 是要查看的目录。

选项并不都能自由组合,不同命令的同名选项也可能含义不同。遇到陌生命令时,应先查帮助,而不是凭经验猜测。

用 man 和 --help 查帮助#

man 用于打开系统安装的手册页,适合查看完整语法、选项和相关文件;多数命令还支持更简短的 --help。

Terminal window
man ls
ls --help

在 man 中可以按 / 搜索,按 n 跳到下一个匹配项,按 q 退出。某些精简系统没有预装手册页,此时可以先使用 --help,再查对应发行版或项目的官方文档。

路径、引号与 --#

  • /etc/hosts 是绝对路径,从根目录 / 开始。
  • ./scripts/build.sh 是相对路径,从当前目录开始。
  • .. 表示上一级目录,~ 表示当前用户的家目录。
  • 路径含空格时应使用引号,例如 cd "My Projects"。
  • 文件名以 - 开头时,可以用 -- 结束选项解析,例如 rm -- -draft.txt。

查看和切换目录#

pwd:确认当前位置#

pwd 输出当前工作目录的绝对路径。它几乎没有日常必需的参数,但在执行相对路径操作、批量处理或删除前非常重要。

/home/alice/projects/demo
pwd

注意:终端提示符显示的路径可能经过缩写,脚本也可能改变工作目录;需要精确判断时,以 pwd 的结果为准。

ls:查看目录内容#

ls 用于列出文件和目录。常用选项如下:

选项作用
-l使用长格式,显示权限、所有者、大小和时间
-a包含以 . 开头的隐藏项
-h与 -l 配合,以易读单位显示大小
-t按修改时间排序
Terminal window
ls -lah
ls -lt /var/log

ls -l 的大小是文件自身大小,不等于目录内全部内容的总大小;查看目录占用应使用后文的 du。-d 可以让 ls 显示目录本身而不是列出目录内容,例如 ls -ld ./config。不要依赖 ls 输出做复杂脚本解析,文件名可以包含空格甚至换行。

cd:切换目录#

cd 是 Shell 内建命令,用于改变当前工作目录。

Terminal window
cd /var/log # 进入绝对路径
cd ../config # 从当前位置进入相对路径
cd ~ # 回到家目录
cd - # 回到上一次所在目录

cd 没有输出通常表示成功。若提示 No such file or directory,先检查路径拼写、大小写和引号;Linux 文件名通常区分大小写。

创建、复制、移动和删除文件#

mkdir:创建目录#

mkdir 用于创建目录。-p 会同时创建缺失的父目录,并在目录已经存在时不报错;-m 可以在创建时指定权限。

Terminal window
mkdir logs
mkdir -p build/output/assets
mkdir -m 750 private-data

注意:mkdir -p 很方便,但路径写错时也会安静地创建一整条错误目录。创建后可以用 ls -ld <目录> 验证。

touch:创建空文件或更新时间#

touch 常用于创建空文件;如果文件已经存在,它默认更新访问时间和修改时间。-c 表示文件不存在时不要创建。

Terminal window
touch README.md
touch -c existing.log

不要把 touch 理解为“只创建文件”。在依赖时间戳的构建流程中,对已有文件执行它可能触发重新构建。

cp:复制文件或目录#

cp 用于复制内容。常用选项包括:

选项作用
-r / -R递归复制目录
-a归档模式,尽量保留权限、时间和符号链接
-i覆盖前询问
-n不覆盖已有文件
-v显示正在处理的路径
Terminal window
cp config.example.yml config.yml
cp -a public/ backup/public/
cp -iv report.md archive/report.md

复制到目录时,末尾斜杠和目标是否存在会影响结果。处理重要目录前,先在测试目录验证结构;不要假设 cp -r source/ target/ 在所有目标状态下都生成同样的层级。

mv:移动或重命名#

mv 可以移动文件,也可以在同一文件系统内重命名。-i 在覆盖前询问,-n 禁止覆盖,-v 显示操作过程。

Terminal window
mv draft.md article.md
mv -iv article.md archive/

同一文件系统内移动通常很快,但跨文件系统移动实际会复制后再删除源文件。默认情况下,目标同名文件可能被覆盖;重要操作应使用 -i 或提前检查目标。

ln -s:创建符号链接#

ln 创建链接,日常更常见的是使用 -s 创建符号链接。-n、-f 会影响已有目标,使用前要格外谨慎。

Terminal window
ln -s /opt/myapp/releases/2026-08 current
ls -l current

相对链接是相对于“链接所在目录”解析的,而不是相对于创建命令时的目录。删除符号链接本身不会删除它指向的目标,但在带递归选项的工具中仍应确认实际行为。

rm:删除文件和目录#

rm 用于删除目录项。常用选项包括 -i(逐项确认)、-r(递归处理目录)、-f(忽略不存在的文件并取消大多数确认)和 -v(显示处理路径)。

Terminal window
rm -i old-report.md
rm -r -- obsolete-directory

查看和搜索文本#

cat 与 less:短文件和长文件#

cat 将文件内容写到标准输出,适合短文件或管道输入;-n 可以显示行号。大文件更适合用 less,其 -N 选项显示行号。

Terminal window
cat -n package.json
less -N /var/log/syslog

在 less 中按 /error 搜索,按 n 查看下一处,按 q 退出。直接 cat 巨大日志会淹没终端,也可能造成明显的 I/O 和渲染开销。

head 与 tail:查看开头、结尾和持续日志#

head 默认显示前 10 行,tail 默认显示后 10 行。二者都可以用 -n 指定行数;tail -f 会持续等待追加内容。

Terminal window
head -n 20 app.log
tail -n 100 app.log
tail -f app.log

tail -f 适合临时观察日志,但不会自动帮你分析问题;结束跟随要按 Ctrl+C。日志轮转后是否继续跟踪取决于选项和实现,GNU tail -F 更适合按文件名重试跟踪。

grep:按内容筛选#

grep 搜索文本行。常用选项有 -n(行号)、-i(忽略大小写)、-r/-R(递归)、-E(扩展正则)、-F(按普通字符串匹配)和 -v(反向筛选)。

Terminal window
grep -nF 'server.port=' application.properties
grep -Rni --exclude-dir=node_modules 'TODO' src/
grep -E 'WARN|ERROR' app.log

当关键词包含 .、[ 等正则字符,而你只想找字面文本时,优先使用 -F。递归搜索前限制目录,并排除依赖或构建产物,否则结果可能过多、速度也会明显下降。

find:按路径属性查找#

find 可以按名称、类型、时间和大小遍历目录。常用条件包括 -type f、-type d、-name、-iname、-maxdepth 和 -mtime。

Terminal window
find . -maxdepth 3 -type f -name '*.md' -print
find 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(只显示重复项)。
Terminal window
wc -l access.log
sort -n scores.txt
sort users.txt | uniq -c

uniq 只合并相邻的重复行,所以通常先 sort。这些工具默认受当前 locale 影响;脚本若要求稳定排序规则,应明确环境,例如 LC_ALL=C sort。

管道和重定向#

管道 | 把左侧命令的标准输出交给右侧命令;> 覆盖文件,>> 追加文件,2> 重定向标准错误。示例中的 printf 按格式输出文本,%s 表示字符串占位,\n 表示换行;相比行为因实现而异的 echo,它更适合脚本生成确定格式的文本。

Terminal window
grep -F 'ERROR' app.log | tail -n 20
printf '%s\n' 'server.port=8080' > application.properties
printf '%s\n' 'startup complete' >> app.log
find 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。

Terminal window
whoami
id
id -u

权限问题不一定意味着需要 sudo,也可能是文件所有者、所属组、目录执行权限或挂载选项不正确。先用 id 和 ls -ld 找原因。

chmod:修改权限位#

chmod 支持符号模式和数字模式。-R 会递归处理目录树,--reference 可以参考另一个文件的权限。

Terminal window
chmod u+x scripts/deploy.sh
chmod go-rwx secrets.env
chmod 644 public.txt
chmod 755 scripts

数字模式中,读、写、执行分别是 4、2、1;每组三者相加得到所有者、组和其他用户的权限。755 不是“通用正确答案”:普通私密文件不应对所有人开放读取,配置文件也通常不需要执行权限。

chown:修改所有者和所属组#

chown 接受 用户:组,-R 表示递归处理,--reference 可以复制参考文件的所有权。

Terminal window
sudo chown appuser:appgroup /srv/myapp/config.yml
sudo chown -R appuser:appgroup /srv/myapp/uploads

更改系统路径通常需要管理员权限。递归 chown 可能破坏包管理器、容器卷或服务账户预期的所有权,因此必须限定到明确的应用目录。

sudo:以其他身份执行单条命令#

sudo 默认以管理员身份执行命令,-u <用户> 可以指定其他用户,-l 查看当前被允许的命令。

Terminal window
sudo -l
sudo systemctl status nginx
sudo -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。

Terminal window
ps aux
ps -ef | grep '[n]ginx'
pgrep -a nginx
pgrep -u "$USER" -a java
top -p 12345

grep '[n]ginx' 可以避免把 grep 自身显示为匹配结果,但脚本中更适合直接使用 pgrep。同名程序可能有多个进程,不能只看名称就结束全部进程。

jobs、bg 与 fg:管理当前 Shell 的任务#

jobs 查看当前 Shell 启动的后台或暂停任务,-l 同时显示 PID;bg 让暂停任务在后台继续;fg 把任务带回前台。

Terminal window
jobs -l
bg %1
fg %1

这里的 %1 是 Shell 任务编号,不是 PID。关闭终端后任务是否继续运行取决于 Shell、信号处理和启动方式;需要长期运行的服务应交给 systemd、容器编排或专用进程管理器。

kill:向进程发送信号#

kill 的参数是 PID。默认发送 SIGTERM,允许程序清理资源后退出;-l 列出信号,-KILL 或 -9 发送无法被捕获的 SIGKILL。

Terminal window
kill -TERM 12345
kill -l
# 仅在进程无法正常退出且 PID 已再次确认时:
kill -KILL 12345

检查磁盘和内存#

df:查看文件系统空间#

df 报告已挂载文件系统的使用情况。-h 使用易读单位,-T 显示文件系统类型,指定路径时会定位该路径所在文件系统。

Terminal window
df -h
df -hT /
df -h /var/lib

文件已经删除但仍被进程打开时,df 的已用空间可能不会立即下降。df 反映文件系统整体,而不是某个目录的逐项大小。

du:统计目录占用#

du 统计路径实际占用。-s 只显示汇总,-h 使用易读单位;GNU du 支持 --max-depth 控制目录层级。

Terminal window
du -sh ./build
du -h --max-depth=1 /var/log | sort -h

扫描大目录可能耗时并产生 I/O。权限不足会导致部分路径无法统计;不要为了消除所有提示而直接对整个根目录使用 sudo du。

lsblk 与 free:设备和内存#

lsblk 展示块设备及挂载关系,-f 增加文件系统信息;free 展示内存与 swap,-h 使用易读单位。

Terminal window
lsblk -f
free -h

free 中的 available 通常比单看 free 更能反映可供新程序使用的内存。lsblk 只读查看是安全的,但不要根据设备名猜测后直接执行格式化或分区命令。

排查网络问题#

ip:查看地址和路由#

ip 是现代 Linux 中管理网络对象的主要工具。ip addr 查看地址,ip route 查看路由,-brief 提供精简输出。

Terminal window
ip -brief addr
ip route

本文只使用只读子命令。ip link set、ip addr add、ip route change 会直接修改网络状态,远程服务器上错误操作可能立刻断开连接。

ping:测试 ICMP 可达性#

ping 发送 ICMP Echo 请求。-c 限制次数,-W 设置等待时间(具体单位和行为以系统实现为准)。

Terminal window
ping -c 4 1.1.1.1
ping -c 4 example.com

能 ping 通不代表 HTTP 服务正常,ping 不通也不一定代表主机离线,因为防火墙可能禁止 ICMP。分别测试 IP 和域名有助于区分网络连接与 DNS 问题。

curl:观察应用层请求#

curl 可以发起 HTTP 等协议请求。-I 只请求响应头,-L 跟随重定向,-v 显示连接和协议细节,-o 写入文件,--fail-with-body 在 HTTP 错误状态下返回失败并保留响应正文。

Terminal window
curl -I https://example.com
curl -L -o release.tar.gz https://example.com/release.tar.gz
curl -v --fail-with-body https://api.example.com/health

-v 可能显示请求头、Cookie 或认证信息,分享输出前要脱敏。不要把来源不明的网络响应直接通过管道交给 sh 或 bash 执行。

ss:查看监听端口和连接#

ss 查看套接字。常用选项:-l 仅监听、-n 不解析名称、-t TCP、-u UDP、-p 显示进程信息。

Terminal window
ss -lnt
sudo ss -lntp
ss -lun

普通用户可能看不到其他用户进程的完整信息。监听在 127.0.0.1 与监听在 0.0.0.0 的可访问范围不同,不能只看到端口号就断言外部可访问。

dig:检查 DNS 结果#

dig 查询 DNS。+short 精简结果,@服务器 指定解析器,记录类型可以写 A、AAAA、CNAME、MX 等。

Terminal window
dig example.com A
dig example.com AAAA +short
dig @1.1.1.1 example.com

某些系统需要额外安装包含 dig 的软件包。不同解析器可能因缓存、地域和 DNS 策略返回不同结果;一次查询不能代表所有用户此刻看到的结果。

压缩、查看和解压归档#

tar:打包目录#

tar 把多个文件归档。常用操作字母:c 创建、t 列表、x 解包、f 指定文件;z 使用 gzip,J 使用 xz,C 在指定目录中操作。

Terminal window
tar -czf app-backup.tar.gz app/
tar -tzf app-backup.tar.gz
mkdir -p restore
tar -xzf app-backup.tar.gz -C restore/

先用 -t 查看归档结构,再解压到新建的空目录。来自不可信来源的归档可能包含异常路径、符号链接或覆盖目标,不应直接解压到项目根目录或系统目录。

gzip 与 gunzip:压缩单个数据流#

gzip 默认压缩单个文件并用 .gz 替换原文件;-k 保留原文件,-d 解压,-c 写到标准输出。gunzip 等价于常见的 gzip -d 用法。

Terminal window
gzip -k access.log
gunzip archived.log.gz
gzip -dc archive.sql.gz | less

gzip 本身不保存目录结构,多文件目录通常先用 tar 打包。gunzip archived.log.gz 默认生成 archived.log 并移除压缩文件,如果目标已经存在通常会拒绝覆盖。解压前确认磁盘空间,压缩文件很小并不意味着解压结果也小。

zip 与 unzip:处理 ZIP 文件#

zip -r 递归压缩目录,unzip -l 只列出内容,unzip -d 指定解压目录。

Terminal window
zip -r source.zip src/
unzip -l source.zip
unzip source.zip -d restore/

默认覆盖策略可能因工具和交互环境不同而变化。自动化脚本要明确是否允许覆盖,陌生 ZIP 同样应先查看列表并解压到隔离目录。

把命令组合成实际工作流#

场景一:持续观察错误日志#

Terminal window
tail -f app.log | grep --line-buffered -E 'WARN|ERROR'

这里 tail -f 持续产生新行,grep --line-buffered 尽快输出匹配结果。完成观察后按 Ctrl+C,不要把它当成正式监控系统。

场景二:排查磁盘空间#

Terminal window
df -h /var/log
du -h --max-depth=1 /var/log 2>/dev/null | sort -h

先用 df 判断文件系统是否真的接近满载,再用 du 缩小目录范围。两者明显不一致时,再考虑已删除但仍被进程占用的文件、挂载点或权限问题。

场景三:查找配置中的端口#

Terminal window
find ./config -type f -name '*.yml' -print
grep -RFn --include='*.yml' 'server.port' ./config

先确认搜索范围,再按普通字符串递归查找。这样比在整个家目录或根目录中无边界搜索更快,也更容易理解结果。

场景四:判断服务是否真正可用#

Terminal window
ss -lntp
curl -v --fail-with-body http://127.0.0.1:8080/health

监听端口只说明有进程绑定了套接字;应用是否健康还要通过协议层请求确认。若服务要被其他设备访问,还需检查绑定地址、容器端口映射、防火墙和网络路径。

操作前的安全检查清单#

  1. 用 pwd 确认当前目录,用 ls 或只读查询确认目标。
  2. 对含空格或通配符的路径使用正确引用;必要时用 -- 结束选项。
  3. 批量修改前先打印匹配结果,从一个样本开始验证。
  4. 优先使用可恢复操作,重要数据先确认备份确实能读取。
  5. rm -r、chmod -R、chown -R 和 kill -KILL 都应有明确理由。
  6. 只在权限确实要求时使用 sudo,不要用更高权限掩盖路径或所有权错误。
  7. 阅读错误信息并检查退出状态,不要因为命令“没有输出”就假设业务结果正确。

真正熟练使用 Linux,不是记住最多的参数,而是能在执行前说明命令的输入、影响范围和失败后果。先观察、再缩小范围、最后修改,这套顺序比任何速查表都更值得形成习惯。

Linux 常用命令指南:文件、权限、进程与网络
https://www.ayahunter.me/posts/linux-common-commands-guide/
作者
ayahunter
发布于
2026-08-30
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取