刚接触 Linux 那会儿,每学习一个命令,我总习惯问下自己这个选项是什么意思,为什么用这个字母。明白了选项对应的含义,才能更容易记住,在使用过程中才能得心应手。比如 rm -rf ,-r 是 recursive(递归),-f 是 force(强制),合起来就是"不问青红皂白、连子目录一起强制删掉"。知道这层意思之后,后面命令就会越用越熟悉,不容易忘记。
这篇文章谈谈Linux中的命令选项到底是怎么拼出来的,以及每个选项后面对应的都是哪个英语单词,供参考。
选项不是乱码,是被压缩过的英文单词
先说个基本认知:Linux 命令行里的每一个选项,几乎都对应一个真实存在的英文单词,只是被"压缩"成了一个字母。
这套规则其实分两层。第一层叫短选项,单横线加一个字母,比如 -a、-l、-h。第二层叫长选项,双横线加完整单词,比如 --all、--long、--help。两者大多数时候是同一件事的两种写法——-a 和 --all 效果相同,前者是给手快的人用的,后者是给人看的。
这个双横线的写法并不是从一开始就有的。早期 Unix 命令行只支持单字母选项,选项一多,字母就不够用了,而且光看字母也猜不出含义。GNU 项目后来扩展出了长选项的写法,专门用双横线开头,为的就是让命令行"可以被人读懂",而不只是被机器解析。这也是为什么你在 tar、gcc、rsync 这类功能复杂的 GNU 工具里,经常能看到大段的 --exclude、--dry-run 这种长选项——功能越复杂,越需要让人一眼看懂在做什么。
另外短选项是可以合并写的。ls -l -a 和 ls -la 是完全等价的,rm -r -f 也可以写成 rm -rf。很多人一开始以为 -rf 是一个整体符号,其实它是两个独立选项拼在了一起,背后仍然是 recursive 和 force 两个词。
同一个字母在不同命令里意思完全不一样
但有时候,一个选项字母,并不是一一对应关系,在不同的命令中对应不同的含义,并不存在一份全网统一的"字母对照表",能让你套用在所有命令上。
-s 在 du 命令里是 size(汇总大小),在 ln 命令里是 symbolic(创建软链接),在 curl 里又是 silent(静默模式)。同一个字母,三种毫不相关的含义。这不是标准混乱,而是因为每个命令的选项都是各自的作者独立设计的,Linux 从来没有强制规定"-s 必须表示什么"。有效的记忆方式是记"单词在这个命令的语境里对应什么"。
三个真正管用的记忆方法
方法一:把选项还原成完整单词读出来
看到 -v 要想到"verbose"。看到 tail -f,想到"tail follow",就是"跟随文件末尾的更新",这样一读,"实时看日志"这个动作立刻就有画面了。这一步看似麻烦,实际上是把一个抽象符号变成了一个有意义的英文短语,大脑对短语的记忆效率天然比对孤立符号高得多。
方法二:按场景成组记,而不是按字母表顺序背
单独记 26 个字母的含义效率很低,因为它们之间没有关联。更好的办法是按"你常做的事"归类:
- • 删东西:
-f(强制)、-r(递归)、-i(交互确认)——这三个几乎总是一起出现在 rm、cp、mv 里 - • 看文件内容:
-n(指定行数)、-f(跟随更新)——这两个是 tail、head 的核心 - • 打包压缩:
-c(创建)、-x(解压)、-z(gzip压缩)、-v(显示过程)、-f(指定文件)——tar -czvf 这五个字母合起来就是"创建一个显示过程的gzip压缩包" - • 确认动作:
-y(自动确认yes)、-n(dry-run模拟执行)——装软件用 -y,怕出错先用 -n 走一遍流程
按任务场景成组之后,你记的不再是孤立的字母,而是一套"做这件事需要哪几个选项"的组合拳,用得越多,越不会忘。
方法三:养成看长选项的习惯
短选项好打字,但长选项好记忆。如果你不确定 -n 是什么意思,直接用 --dry-run;不确定 -r 和 -R 的区别,写 --recursive 反而更清楚。尤其是写自动化脚本的时候,用长选项几乎是零成本的——脚本不需要你少打几个字,但需要半年后的你(或者接手的同事)一眼看懂这行命令在干什么。
我自己现在写一次性命令用短选项图快,但凡是要写进脚本里长期跑的,一律换成长选项,后续再看脚本的时候就更容易看明白。
实在记不住怎么办
老实说,即便掌握了上面的方法,也没有人能背下所有命令的所有选项——包括写这些命令的人自己可能都记不全。真正的高手不是记忆力好,而是清楚在哪里能立刻查到答案。
两个终端里就能用的办法:man 命令名 能看到完整的官方手册,命令名 --help 通常给出更精简的速查列表。养成"不确定就查一下"的习惯,比死磕记忆本身更重要。
记忆小贴士
- 1. 同字母不同义是常态:Linux 命令选项由各命令作者自行设计,
-s 在 du 中是 size,在 ln 中是 symbolic,需要结合命令本身理解,不能死记字母。 - 2. 大小写常成对但含义相反或相关:例如
-r(recursive)与 -R 效果相同(多数命令不区分),但 -v(verbose)与 -V(version)含义完全不同。 - 3. 优先查
man 或 --help:本表用于快速联想记忆,遇到不确定的选项,man 命令名 或 命令 --help 是最权威的来源。 - 4. GNU 长选项更易读:日常脚本编写建议优先使用长选项(如
--verbose 而非 -v),可读性更好,尤其在协作或公众号教程写作时更利于读者理解。
Linux 命令选项缩写全览
一、常见目录缩写
| | |
|---|
| | |
| | |
| | |
| | 附加的配置文件(另一说:Editable Text Configuration) |
| | |
| | |
| | |
| | |
| | |
| | Unix 系统资源(常见误传为 User,实际官方含义如左) |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
二、命令选项缩写(a-z)
每个字母下按常见程度排列;标"多义"的表示该字母在不同命令中差异较大,需结合具体命令判断。
-a
ls -a # 显示所有文件,包括隐藏文件(以.开头)uname -a # 显示内核版本、主机名等全部系统信息cp -a source/ dest/ # 归档复制,保留权限、时间戳、软链接等全部属性
-b
du -b file.txt # 以字节为单位显示文件大小top -b -n 1 # 批处理模式运行一次top,常用于脚本采集数据cp -b config.conf config.conf.bak # 覆盖前自动备份原文件
-c
| | |
|---|
| | bash -c |
| | tar -c |
| | grep -c |
| | chmod -c |
| | dd conv |
| | taskset -c |
bash -c "echo hello"# 执行一段命令字符串tar -czvf backup.tar.gz /data # 创建一个压缩归档文件grep -c "error" app.log # 统计日志中"error"出现的行数
-d
| | |
|---|
| | ls -d |
| | bash -d |
| | sed -d |
| | diff -d |
| | mknod -d |
| | find -maxdepth |
ls -d */ # 只列出当前目录下的子目录,不进入查看内容find . -type d -name "log*"# 查找名字以log开头的目录diff -d file1.txt file2.txt # 对比两个文件差异
-e
| | |
|---|
| | xterm -e |
| | crontab -e |
| | rsync --exclude |
| | sed -e |
| | test -e |
| | echo -e |
crontab -e # 编辑当前用户的定时任务sed -e 's/foo/bar/' file.txt # 使用表达式将文件中foo替换为bar[ -e /etc/passwd ] && echo"存在"# 判断文件是否存在echo -e "第一行\n第二行"# 启用\n等转义字符
-f
| | |
|---|
| | cp -f |
| | tar -f |
| | ssh -f |
| | ssh -f |
| | tail -f |
| | date +format |
rm -f temp.txt # 强制删除文件,不再询问确认tar -xf archive.tar # 从指定文件解压(-f后面接文件名)tail -f /var/log/syslog # 实时跟踪日志文件新增内容docker-compose -f prod.yml up # 指定使用哪个配置文件启动
-g
chgrp developers project/ # 将project目录的所属组改为developersls -lg file.txt # 长格式列出但省略属主,只显示属组
-h
df -h # 以GB/MB等人类易读单位显示磁盘使用情况du -sh /var/log # 汇总显示目录大小,如"1.2G"而非字节数tar --help# 查看tar命令的完整帮助
-i
| | |
|---|
| | rm -i |
| | grep -i |
| | grep -i |
| | ssh -i |
| | ls -i |
rm -i *.log# 删除前逐个询问确认,避免误删grep -i "error" app.log # 不区分大小写搜索error/Error/ERRORssh -i ~/.ssh/id_rsa user@host # 指定私钥文件登录
-j
make -j4 # 使用4个并行任务编译,加快速度tar -xjf archive.tar.bz2 # 解压bzip2格式的压缩包
-k
gzip -k file.txt # 压缩的同时保留原文件(默认会删除原文件)killall -9 nginx # 强制终止所有nginx进程du -k file.txt # 以KB为单位显示文件大小
-l
| | |
|---|
| | ls -l |
| | tar -t |
| | |
| | wc -l |
| | ln |
| | ulimit -l |
ls -l # 长格式列出文件权限、属主、大小、时间等wc -l access.log # 统计文件的行数ln -s /data/app /home/app # 创建软链接(快捷方式)
-m
| | |
|---|
| | cvs -m |
| | whereis -m |
| | useradd -m |
| | du -m |
| | mount -m |
| | find -mtime |
git commit -m "修复登录bug"# 提交时附带说明信息useradd -m newuser # 创建用户的同时自动建立home目录find . -mtime -7 # 查找7天内被修改过的文件
-n
| | |
|---|
| | cat -n |
| | useradd -n |
| | netstat -n |
| | echo -n |
tail -n 50 app.log # 只看日志最后50行cat -n script.sh # 显示文件内容并带上行号rsync -avn source/ dest/ # 模拟执行(dry-run),不真正复制文件
-o
| | |
|---|
| | gcc -o |
| | mount -o |
| | grep -o |
| | chown |
gcc main.c -o main # 编译并指定输出的可执行文件名curl -o photo.jpg https://x.com/pic.jpg # 下载文件并保存为指定文件名grep -o "[0-9]\+" file.txt # 只输出匹配到的部分,而非整行
-p
| | |
|---|
| | ssh -p |
| | nc -p |
| | mysql -p |
| | cp -p |
| | mkdir -p |
| | ps -p |
| | pgrep -p |
ssh -p 2222 user@host # 通过非默认端口2222连接mkdir -p a/b/c # 递归创建多级目录,父目录不存在也不会报错cp -p old.conf new.conf # 复制文件的同时保留原始权限和时间戳
-q
wget -q https://example.com/file.zip # 静默下载,不打印进度信息rpm -q nginx # 查询nginx软件包是否已安装
-r / -R
ls -lr # 反向排序显示文件列表cp -r project/ backup/ # 递归复制整个目录及其子内容chmod -R 755 www/ # 递归修改目录下所有文件的权限
-s
| | |
|---|
| | curl -s |
| | ls -s |
| | ln -s |
| | mail -s |
| | du -s |
| | kill -s |
curl -s https://api.example.com/data | jq . # 静默请求,不显示进度条,方便和其他命令搭配du -sh /home/* # 汇总显示每个用户目录的总大小ln -s /usr/bin/python3 /usr/bin/python # 创建软链接
-t
| | |
|---|
| | mount -t |
| | git tag |
| | ls -t |
| | ssh -t |
| | tar -t |
| | ls --tabsize |
find . -type f -name "*.log"# 只查找文件类型(非目录)ls -lt # 按修改时间从新到旧排序tar -tf archive.tar # 只列出压缩包内的文件列表,不解压
-u
| | |
|---|
| | chown -u |
| | cp -u |
| | python -u |
| | umount |
| | id -u |
rsync -avu source/ dest/ # 只同步比目标更新的文件ps -u www-data # 查看指定用户的进程id -u # 输出当前用户的UID数字
-v
cp -v file1.txt file2.txt # 复制时打印详细过程grep -v "DEBUG" app.log # 反向匹配,排除包含DEBUG的行python3 --version # 查看版本号
-w
| | |
|---|
| | ls -w |
| | gcc -w |
| | test -w |
| | wall -w |
[ -w /tmp/test.txt ] && echo"可写"# 判断文件是否可写gcc -Wall main.c # 编译时开启所有警告提示(大写W为长选项风格)
-x
| | |
|---|
| | tar -x |
| | tar -x |
| | test -x |
| | bash -x |
| | find -xdev |
tar -xzvf archive.tar.gz # 解压gzip压缩的tar包chmod +x deploy.sh # 给脚本添加可执行权限bash -x script.sh # 以调试模式运行脚本,打印每条执行的命令
-y
apt install -y nginx # 安装时自动确认,无需手动输入yyum update -y # 自动确认更新所有软件包
-z
tar -czvf backup.tar.gz /data # 用gzip压缩创建归档文件[ -z "$VAR" ] && echo"变量为空"# 判断变量是否为空字符串
三、常见长选项(Long Options)补充
短选项之外,GNU 工具通常还提供更易读的长选项,两者往往一一对应:
rm --recursive --force old_folder/ # 等价于 rm -rf old_folder/rsync --verbose --dry-run src/ dst/ # 等价于 rsync -vn src/ dst/