1. 引言:Linux 命令世界的两大基石
当你打开终端,输入 ls 查看文件、用 cd 切换目录、用 mount 挂载磁盘时,是否想过这些命令从何而来?在 Linux 生态中,这些基础命令主要来自两个核心工具集:GNU Coreutils 和 util-linux。
这两个工具集的分工简单而清晰:
| 工具集 | 维护者 | 核心定位 | 典型命令 |
|---|
| GNU Coreutils | GNU 项目 | 文件操作、文本处理、Shell 交互 | ls, cp, cat, grep |
| util-linux | Linux 内核组织 | 系统底层管理(磁盘、挂载、终端、日志) | mount, fdisk, dmesg, hwclock |
你可以这样理解:GNU Coreutils 是 Linux 的"双手",负责日常的文件和文本操作;util-linux 是 Linux 的"五脏六腑",负责管理系统底层资源。
有趣的历史是:Linus Torvalds 在 1991 年写出 Linux 内核后,内核本身无法做任何有用的事——没有 Shell、没有 ls、没有文件复制命令。他使用了自由软件基金会(FSF)开发的 GNU 工具集来填补这个空白,这也是为什么许多人主张 Linux 系统应称为 GNU/Linux。
2. GNU Coreutils:日常操作的瑞士军刀
2.1 工具集概况
GNU Coreutils 是一个大杂烩,由三个历史工具集合并而来:fileutils(文件操作)、shellutils(Shell 相关)和 textutils(文本处理)。如今它包含 102 个核心命令。
2.2 功能分类全览
根据 GNU 官方手册的分类,Coreutils 命令按功能分为以下组别:
2.2.1 文件输出与查看
| 命令 | 功能 | 典型用法 |
|---|
cat | 连接并输出文件内容 | cat file.txt |
tac | 反向输出文件(行序反转) | tac file.txt |
nl | 给文件加行号 | nl script.sh |
od | 八进制/十六进制转储 | od -x binary.bin |
base32/base64 | Base32/64 编解码 | base64 file.zip |
2.2.2 文件格式化
| 命令 | 功能 |
|---|
fmt | 重新格式化段落 |
pr | 将文本分页/分列打印 |
fold | 折行(按宽度截断) |
2.2.3 文件部分提取
| 命令 | 功能 | 示例 |
|---|
head | 取文件开头 | head -n 20 log.txt |
tail | 取文件末尾(支持 -f 实时跟踪) | tail -f /var/log/syslog |
split | 分割文件 | split -l 1000 big.csv part_ |
csplit | 按上下文分割 | csplit file /regex/ |
2.2.4 文件统计与校验
| 命令 | 功能 |
|---|
wc | 统计行、词、字节数 |
sum/cksum | 传统/现代校验和 |
md5sum/sha1sum/sha256sum | 哈希校验 |
b2sum | BLAKE2 哈希 |
2.2.5 排序与去重
| 命令 | 功能 |
|---|
sort | 排序(支持 -n 数字、-r 反向、-k 按字段) |
shuf | 随机打乱行序 |
uniq | 去重(需预先排序) |
comm | 逐行比较两个已排序文件 |
tsort | 拓扑排序 |
2.2.6 字段操作与字符转换
| 命令 | 功能 |
|---|
cut | 提取字段(按列或分隔符) |
paste | 横向合并文件列 |
join | 按公共字段连接两个文件 |
tr | 字符替换/删除 |
expand/unexpand | Tab 与空格互转 |
2.2.7 目录列表
| 命令 | 功能 |
|---|
ls | 列出目录内容 |
dir | ls -C 的同义词(列式输出) |
vdir | ls -l 的同义词(长格式) |
dircolors | 配置 ls 的颜色方案 |
2.2.8 基础文件操作
| 命令 | 功能 |
|---|
cp | 复制文件 |
dd | 底层复制(指定块大小,常用于刻录) |
install | 复制并设置属性(用于 Makefile) |
mv | 移动/重命名 |
rm | 删除 |
shred | 安全删除(多次覆写) |
2.2.9 特殊文件操作
| 命令 | 功能 |
|---|
ln | 创建硬/软链接 |
mkdir/rmdir | 创建/删除目录 |
mkfifo | 创建命名管道 |
mknod | 创建设备文件 |
readlink | 显示符号链接目标 |
unlink | 调用 unlink() 删除文件 |
2.2.10 文件属性修改
| 命令 | 功能 |
|---|
chown | 修改属主/属组 |
chgrp | 修改属组 |
chmod | 修改权限 |
touch | 修改时间戳或创建空文件 |
2.2.11 磁盘与空间
| 命令 | 功能 |
|---|
df | 查看文件系统磁盘使用 |
du | 查看目录/文件占用 |
stat | 显示详细文件状态 |
sync | 刷新缓存到磁盘 |
truncate | 截断/扩展文件 |
2.2.12 文本输出
| 命令 | 功能 |
|---|
echo | 输出字符串 |
printf | 格式化输出 |
yes | 无限输出 “y”(用于自动化确认) |
2.2.13 条件测试
| 命令 | 功能 |
|---|
true | 始终返回 0(成功) |
false | 始终返回 1(失败) |
test / [ ] | 条件测试 |
expr | 表达式求值 |
2.2.14 重定向与上下文
| 命令 | 功能 |
|---|
tee | 同时输出到文件和控制台 |
pwd | 显示当前目录 |
stty | 设置终端特性 |
printenv | 打印环境变量 |
tty | 显示终端文件名 |
2.2.15 用户信息
| 命令 | 功能 |
|---|
id | 显示用户 UID/GID |
logname | 显示登录名 |
whoami | 显示当前有效用户 |
groups | 显示用户所属组 |
users | 显示登录用户列表 |
who | 详细登录信息 |
2.2.16 系统信息
| 命令 | 功能 |
|---|
date | 显示/设置日期时间 |
arch | 显示硬件架构 |
nproc | 显示 CPU 核心数 |
uname | 显示系统信息 |
hostname | 显示/设置主机名 |
uptime | 显示运行时间和负载 |
2.2.17 进程控制与延迟
| 命令 | 功能 |
|---|
kill | 发送信号到进程 |
sleep | 延迟指定秒数 |
2.2.18 数值与序列
| 命令 | 功能 |
|---|
factor | 因数分解 |
numfmt | 数字格式转换(如易读格式) |
seq | 生成数字序列 |
2.2.19 修改命令执行
| 命令 | 功能 |
|---|
chroot | 改变根目录执行命令 |
env | 修改环境执行命令 |
nice/renice | 调整进程优先级 |
nohup | 忽略挂断信号执行 |
stdbuf | 修改缓冲区行为 |
timeout | 设置超时 |
2.3 GNU Coreutils 的设计哲学
GNU Coreutils 遵循 Unix 哲学的核心:每个命令做好一件事。例如:
sort 只负责排序uniq 只负责去重- 通过管道
| 将多个小工具串联成复杂数据处理流水线
这也解释了为什么 Coreutils 命令在 Shell 脚本中如此常见——它们是数据流处理的"积木块"。
3. util-linux:系统底层的全能管家
3.1 工具集概况
util-linux 由 Linux 内核组织 维护,是 Linux 系统底层管理的核心工具包。它最初由三个独立集合(fileutils、shellutils、textutils)中未被合并入 Coreutils 的部分组成,2003 年左右整合为统一的 util-linux。
3.2 功能分类全览
3.2.1 磁盘分区与格式化
| 命令 | 功能 | 典型用法 |
|---|
fdisk | 传统分区工具(MBR/GPT) | sudo fdisk /dev/sda |
cfdisk | 基于 ncurses 的交互式分区工具 | sudo cfdisk /dev/sda |
sfdisk | 脚本化分区工具(用于自动化) | sfdisk -d /dev/sda > part.txt |
partx | 解析分区表并设备映射 | partx -a /dev/sda |
resizepart | 调整分区大小 | resizepart /dev/sda 2 100G |
delpart/addpart | 删除/添加分区(底层) | |
blkdiscard | 丢弃设备块(TRIM 操作) | blkdiscard /dev/sda |
3.2.2 文件系统挂载与管理
| 命令 | 功能 | 说明 |
|---|
mount | 挂载文件系统 | mount /dev/sda1 /mnt |
umount | 卸载文件系统 | umount /mnt |
mountpoint | 检查是否为挂载点 | mountpoint /home |
swapon/swapoff | 启用/禁用交换分区 | swapon /dev/sda2 |
findmnt | 查找挂载点(树形输出) | findmnt |
lsblk | 树形列出块设备 | lsblk -f |
blkid | 显示块设备属性(UUID、TYPE) | blkid /dev/sda1 |
wipefs | 擦除文件系统签名 | wipefs /dev/sda1 |
3.2.3 文件系统创建
| 命令 | 功能 |
|---|
mkfs | 通用创建文件系统(实际调用具体 mkfs 变体) |
mkfs.bfs | 创建 BFS 文件系统 |
mkfs.cramfs | 创建 CRAMFS 压缩只读文件系统 |
mkfs.minix | 创建 MINIX 文件系统 |
mkswap | 创建交换分区 |
3.2.4 文件系统检查
| 命令 | 功能 |
|---|
fsck | 文件系统检查(调用具体 fsck 变体) |
fsck.cramfs | CRAMFS 一致性检查 |
fsck.minix | MINIX 文件系统检查 |
3.2.5 终端与登录管理
| 命令 | 功能 | 说明 |
|---|
agetty | 打开 TTY 端口并提示登录 | 常由 systemd 自动调用 |
login | 启动登录会话 | |
su | 切换用户 | su - root |
runuser | 以指定用户运行(不触发 PAM 会话) | 用于服务脚本 |
sulogin | 单用户模式登录(紧急 shell) | |
setterm | 设置终端属性 | setterm -blank 10 |
mesg | 控制写权限(write 命令) | mesg n 拒绝消息 |
wall | 向所有终端广播消息 | wall "System will reboot" |
write | 向特定用户发送消息 | write bob |
3.2.6 终端文本处理
| 命令 | 功能 |
|---|
col | 过滤反向换行符(处理 nroff 输出) |
colcrt | 为 CRT 终端过滤 nroff 输出(处理粗体和下划线) |
colrm | 删除指定列 |
column | 将输入格式化为多列 |
rev | 反转每行字符顺序 |
hexdump | 十六进制转储 |
more | 分页查看(less 的功能超集) |
ul | 将下划线转换为终端转义序列 |
pg | 分页查看(较古老) |
3.2.7 日志与内核消息
| 命令 | 功能 | 说明 |
|---|
dmesg | 查看/控制内核环形缓冲区 | `dmesg |
logger | 向系统日志发送消息 | logger "Script started" |
3.2.8 硬件与时钟
| 命令 | 功能 | 说明 |
|---|
hwclock | 读写硬件时钟(RTC/BIOS 时钟) | hwclock --systohc |
arch | 显示机器架构 | |
lscpu | 显示 CPU 架构信息 | |
lsirq | 显示中断请求信息 | |
lslocks | 显示锁文件信息 | |
lslogins | 显示用户登录信息 | |
3.2.9 进程管理
| 命令 | 功能 |
|---|
kill | 向进程发送信号 |
renice | 调整运行中进程的优先级 |
taskset | 设置进程的 CPU 亲和性 |
chrt | 设置实时调度属性 |
ionice | 设置 I/O 调度类/优先级 |
prlimit | 获取/设置资源限制 |
3.2.10 会话与命名空间
| 命令 | 功能 | 说明 |
|---|
setsid | 在新会话中运行程序 | 后台脱离终端 |
unshare | 运行程序于新命名空间 | 容器底层 |
nsenter | 进入其他进程的命名空间 | |
pivot_root | 移动根文件系统 | 用于 initramfs |
switch_root | 切换到新根文件系统 | |
3.2.11 权限与安全
| 命令 | 功能 |
|---|
setpriv | 以指定特权运行程序 |
setarch | 改变架构报告(如 32 位兼容) |
chfn | 修改 GECOS 字段(用户信息) |
chsh | 修改登录 Shell |
newgrp | 切换主组 |
nologin | 拒绝登录的显示程序 |
3.2.12 循环设备管理
| 命令 | 功能 |
|---|
losetup | 设置/控制循环设备 |
zramctl | 管理 zRAM 设备 |
3.2.13 其他实用工具
| 命令 | 功能 |
|---|
cal | 显示日历 |
rename | 批量重命名文件(支持表达式) |
whereis | 定位命令的二进制、源码和手册 |
script | 记录终端会话 |
scriptreplay | 回放记录的会话 |
getopt | 解析命令行选项 |
flock | 文件锁(用于 Shell 脚本同步) |
ipcmk/ipcrm/ipcs | System V IPC 管理 |
uuidgen | 生成 UUID |
uuidd | UUID 生成守护进程 |
fallocate | 预分配文件空间 |
eject | 弹出光驱 |
mcookie | 生成 xauth “magic cookie” |
4. 两大工具集对比
4.1 功能域对照表
| 功能域 | GNU Coreutils | util-linux |
|---|
| 文件复制/移动/删除 | ✅ cp, mv, rm | ❌ |
| 文件内容查看 | ✅ cat, head, tail | ❌ |
| 目录列表 | ✅ ls | ❌ |
| 文本处理(排序、去重) | ✅ sort, uniq | ❌ |
| 权限修改 | ✅ chmod, chown | ❌ |
| 链接创建 | ✅ ln | ❌ |
| 目录创建/删除 | ✅ mkdir, rmdir | ❌ |
| 磁盘分区 | ❌ | ✅ fdisk, cfdisk |
| 文件系统挂载 | ❌ | ✅ mount, umount |
| 文件系统创建 | ❌ | ✅ mkfs.* |
| 交换空间 | ❌ | ✅ swapon/swapoff |
| 终端登录 | ❌ | ✅ agetty, login |
| 硬件时钟 | ❌ | ✅ hwclock |
| 内核消息 | ❌ | ✅ dmesg |
| 会话与命名空间 | ❌ | ✅ unshare, nsenter |
| 用户信息 | ✅ id, who | ✅ lslogins |
| 系统信息 | ✅ uname | ✅ lscpu |
4.2 重叠与模糊边界
某些命令似乎"本应"属于某个工具集,但实际归属可能出人意料:
| 命令 | 实际归属 | 直觉归属 | 说明 |
|---|
more | util-linux | Coreutils | 历史原因,more 在 util-linux 中 |
kill | Coreutils | util-linux | Coreutils 的进程控制组包含 kill |
logger | util-linux | Coreutils | 系统日志工具,非文本处理 |
cal | util-linux | Coreutils | 日历显示与系统配置相关 |
rename | util-linux | Coreutils | 不同版本功能差异大 |
4.3 选择建议
日常文件与文本操作 → 查阅 info coreutils
磁盘、系统、底层管理 → 查阅 man <command>(util-linux 命令)
如果需要查看某个命令的归属,可以使用 dpkg -S (Debian/Ubuntu) 或 rpm -qf (RHEL) 查询:
dpkg -S $(which mount)
dpkg -S $(which ls)
5. 文档查阅方式
5.1 Coreutils 官方手册
info coreutils
进入后,使用方向键浏览分组的命令列表,按 Enter 进入详情。
5.2 单个命令帮助
man ls
ls --help
5.3 命令归属查询
type ls
type -a mount
6. 总结:两张"工具箱"覆盖了整个 Linux 操作
GNU Coreutils 和 util-linux 共同覆盖了 Linux 操作的核心需求:
虽然它们常被忽略(“不就是 ls 嘛”),但这两个工具集支撑了从最简单的文件查看到最复杂的系统维护工作。下次使用 mount 或 ls 时,不妨想想背后这两个默默贡献了数十年的开源项目。
所有评论(0)