Skip to content

You Don't Need GUI:用命令行替代图形界面

GUI(图形界面)对普通用户友好,但它是为了降低早期 CLI 的学习门槛而生的——从 1970 年代 Xerox Star 8010 工作站开始,人们相信「点一点」比「敲命令」更容易上手。但它通常消耗更多计算资源,在自动化、批处理、远程操作(SSH)方面远不如 CLI 强大。

本文是经典开源项目 you-dont-need/You-Dont-Need-GUI 的整理版:把「你可能想用鼠标去点」的日常任务,逐个给出命令行实现。检索方式:本文按主题分组,找到你的场景直接抄命令即可;示例命令以 macOS / Linux 为主,系统差异处已注明。

文件与目录操作

文件管理 80% 的动作就是复制、移动、重命名、删除——这些在终端里都是一行命令,且天然支持通配符与批处理。

bash
cp readme.txt documents/          # 拷贝文件到目录
cp readme.txt readme.bak.txt      # 创建文件副本(等价于右键「复制 + 粘贴 + 改名」)
cp readme{,.bak}.txt              # 同上,用花括号展开;试试 touch foo{1,2,3}.txt 理解 {} 的威力
cp -a myMusic myMedia/            # 拷贝整个目录(-a 保留权限/链接等属性)
cp -a myMusic myMedia/myMusic/    # 或明确目标位置

mv readme.txt documents/          # 移动文件;注意目标目录末尾的斜杠 /,否则会被当成重命名
mv readme.txt README.md           # 重命名文件
mv myMedia myMusic/               # 移动目录;同理,目标以 / 结尾才是「移进去」
mv myMedia/ myMusic/myMedia

rsync -a /images/ /images2/       # 合并目录;当心:同名文件会被覆盖

touch 'new file'                  # 创建新文件(已存在则只更新时间戳)
> 'new file'                      # 同上,但会清空已存在文件的内容

mkdir 'untitled folder'           # 创建新目录
mkdir -p path/may/not/exist/untitled\ folder   # 递归创建不存在的中间路径

rm my_useless_file                # 删除文件——注意:是永久删除,等价于「移入回收站再清空」!
rm -r my_useless_folder           # 递归删除整个目录,谨慎使用
find . -name "*.bak" -type f -delete   # 按条件批量删除(先不加 -delete 跑一遍看范围!)

查看与属性

把 Finder / 文件浏览器里「列表视图、简介、搜索陈旧文件」都搬到命令行:

bash
ls my_folder                      # 简单列出
ls -la my_folder                  # -l 列表格式;-a 含隐藏文件
ls -alrth my_folder               # -r 倒序;-t 按修改时间排;-h 人类可读大小

tree                              # 目录树(Linux;macOS 先 brew install tree)
find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'   # macOS 无 tree 时的替代

du -sh node_modules/              # 目录/文件占用的总大小
stat -x readme.md                 # 文件详细信息(macOS)
stat readme.md                    # 文件详细信息(Linux)

find my_folder -mtime +5          # 找出 5 天前之后未再修改的陈旧文件

文本内容与检索(grep)

「看文件」与「在文件里搜」是终端最频繁的两种阅读操作:

bash
cat apps/settings.py              # 直接输出文件全部内容
less apps/settings.py             # 大文件分页阅读(空格翻页、q 退出)
grep -i "Query" file.txt          # 在文件中检索文本

grep 命令常用参数速查:-E 正则、-v 反选、-o 只输出匹配片段、-i 忽略大小写、-l 只列文件名、-F 不按正则、-r 递归目录、-a 不跳过二进制文件、-A/-B/-C 附带上下文

grep 常用参数说明:

  • -i:忽略大小写匹配(-i = ignore case);
  • -A / -B / -C <N>:顺带输出上下文,-A 后 N 行、-B 前 N 行、-C 前后各 N 行;
  • -E:按正则表达式匹配(等价 egrep);
  • -v:反选——输出不匹配的行;
  • -l:只输出命中的文件名(适合「哪些文件里有这个东西」);
  • -F:把检索词当纯文本,不解释为正则(等价 fgrep);
  • -r:递归检索整个目录下所有文件;
  • -o:只输出匹配到的片段,而不是整行;
  • -a:把二进制文件也当文本检索,而不是默认跳过。

检索代码时也可以换用更快的专用工具:ackag(The Silver Searcher)、ripgreprg),它们在递归检索大仓库时更快、且默认尊重 .gitignore

归档与压缩

告别「右键 → 压缩 / 解压」,也不用再装 WinRAR:

bash
zip -r archive_name.zip folder_to_compress   # 压缩整个目录
unzip archive_name.zip                       # 解压
zipinfo archive_name.zip                     # 只查看压缩包内容清单
unzip -l archive_name.zip                    # 同上(-l = list)

打开与预览

bash
open file                     # 用默认程序打开文件(macOS)
xdg-open file                 # 同上(Linux)
open -a appName file          # 指定应用打开(macOS)
imgcat image.png              # 在终端里直接预览图片(macOS iTerm2)
qlmanage -p <file>            # 从命令行调用 macOS「快速预览」

系统与资源

活动监视器 / 任务管理器能干的事,下面全都能干:

bash
cal                           # 文本日历(当月)
cal 11 2018                   # 某年某月的日历
date +%m/%d/%Y                # 今天的日期
date -d "+7 days"             # 一周后的日期(Linux)
date -j -v+7d                 # 一周后的日期(macOS)

bc                            # 计算器;bc -l 开启浮点数学库

df -h                         # 磁盘分区与用量总览
top                           # 进程与 CPU/内存实时视图
htop                          # 更好用的 top(brew install htop)
top -o vsize                  # 按内存排序,看是什么拖慢了 mac

killall program_name          # 强制退出某个应用(按名字,如 killall Safari)

网络与域名

不开浏览器、不装网络工具箱,直连诊断:

bash
curl -i umair.surge.sh                    # 查看 HTTP 响应头与状态(-i = include headers)
nc -vz www.google.com 443                 # 检查某地址某端口能否连通
nc -vz 1.1.1.1 53
dig www.google.com                        # 查看域名的 DNS 解析记录
whois www.google.com                      # 查看域名注册人与注册信息

历史记录与命令行技巧

macOS 命令行小贴士:!! 重复上条、sudo !! 提权重跑、!word 带前缀重跑、空格开头不进历史、at 定时执行、caffeinate 阻止休眠等

写给 macOS 用户,但 bash / zsh 大多通用:

bash
!!                              # 再执行一次上一条命令
sudo !!                         # 以管理员权限执行上一条命令
!<word>                         # 找出并执行历史上以 <word> 开头的最近命令
!<word>:p                       # 只打印该命令,不执行(:p = print)
<space>command                  # 行首空格 = 执行但不写入历史记录
echo "ls -l" | at midnight      # 在指定时间执行命令(macOS 默认无 at,需 sudo launchctl 启用)
caffeinate -u -t 3600           # 接下来一小时不让 mac 休眠
ls -lhs                         # 按文件大小排序并显示可读大小
top -o vsize                    # 看是什么进程占内存拖慢系统

Shell 热键

编辑命令时手不离开主键区,效率翻倍:

热键作用
Ctrl + A跳到当前命令行的行首
Ctrl + E跳到当前命令行的行尾
Ctrl + L清屏(等同 clear
Ctrl + U删除光标之前的内容(行尾处即清空整行)
Ctrl + H等同退格 Backspace
Ctrl + R反向搜索历史命令
Ctrl + C强制终止当前正在运行的命令
Ctrl + D退出当前 shell
Ctrl + Z挂起当前程序到后台,fg 恢复
Ctrl + W删除光标前的一个词
Ctrl + K删除光标之后到行尾的内容
Ctrl + T交换光标前的两个字符
Ctrl + F / Ctrl + B光标向前 / 向后移动一个字符
Esc + T / Alt + T交换光标前的两个词
Alt + F / Alt + B光标前进 / 后退一个词
Alt + .粘贴上一条命令的最后一个参数
Tab自动补全文件 / 目录名

记不住这些命令怎么办

  • man <命令> 查看手册,或 man -k <关键词> 搜索手册;
  • 在线查:Google / Stack Overflow;
  • tldr:由社区维护的、简化版的 man 页面合集,每个命令只给出最常用的几个例子——终端速查的终极方案;
  • 常用命令进阶可搭配 alias 固化自己的高频片段。

来源与致谢

内容整理自开源项目 you-dont-need/You-Dont-Need-GUI(含社区中文翻译),正文结构按文档站排版习惯重新编排。文中插图版权归原作者:

相关主题:Linux 与系统管理监控与告警

基于 VitePress 构建 · 内容以知识共享方式沉淀