1. 引言:Linux 命令世界的两大基石

当你打开终端,输入 ls 查看文件、用 cd 切换目录、用 mount 挂载磁盘时,是否想过这些命令从何而来?在 Linux 生态中,这些基础命令主要来自两个核心工具集:GNU Coreutils 和 util-linux。

这两个工具集的分工简单而清晰:

工具集维护者核心定位典型命令
GNU CoreutilsGNU 项目文件操作、文本处理、Shell 交互ls, cp, cat, grep
util-linuxLinux 内核组织系统底层管理(磁盘、挂载、终端、日志)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/base64Base32/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哈希校验
b2sumBLAKE2 哈希
2.2.5 排序与去重
命令功能
sort排序(支持 -n 数字、-r 反向、-k 按字段)
shuf随机打乱行序
uniq去重(需预先排序)
comm逐行比较两个已排序文件
tsort拓扑排序
2.2.6 字段操作与字符转换
命令功能
cut提取字段(按列或分隔符)
paste横向合并文件列
join按公共字段连接两个文件
tr字符替换/删除
expand/unexpandTab 与空格互转
2.2.7 目录列表
命令功能
ls列出目录内容
dirls -C 的同义词(列式输出)
vdirls -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.cramfsCRAMFS 一致性检查
fsck.minixMINIX 文件系统检查
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/ipcsSystem V IPC 管理
uuidgen生成 UUID
uuiddUUID 生成守护进程
fallocate预分配文件空间
eject弹出光驱
mcookie生成 xauth “magic cookie”

4. 两大工具集对比

4.1 功能域对照表

功能域GNU Coreutilsutil-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 重叠与模糊边界

某些命令似乎"本应"属于某个工具集,但实际归属可能出人意料:

命令实际归属直觉归属说明
moreutil-linuxCoreutils历史原因,more 在 util-linux 中
killCoreutilsutil-linuxCoreutils 的进程控制组包含 kill
loggerutil-linuxCoreutils系统日志工具,非文本处理
calutil-linuxCoreutils日历显示与系统配置相关
renameutil-linuxCoreutils不同版本功能差异大

4.3 选择建议

日常文件与文本操作 → 查阅 info coreutils
磁盘、系统、底层管理 → 查阅 man <command>(util-linux 命令)

如果需要查看某个命令的归属,可以使用 dpkg -S (Debian/Ubuntu) 或 rpm -qf (RHEL) 查询:

# 查看 mount 命令属于哪个包(应是 util-linux)
dpkg -S $(which mount)

# 查看 ls 命令属于哪个包(应是 coreutils)
dpkg -S $(which ls)

5. 文档查阅方式

5.1 Coreutils 官方手册

info coreutils

进入后,使用方向键浏览分组的命令列表,按 Enter 进入详情。

5.2 单个命令帮助

# 标准方式
man ls

# 简略方式(仅展示用法)
ls --help

5.3 命令归属查询

# 查看命令类型(内置/外部/别名)
type ls
# 输出: ls is aliased to `ls --color=auto'

type -a mount
# 输出: mount is /usr/bin/mount

6. 总结:两张"工具箱"覆盖了整个 Linux 操作

GNU Coreutils 和 util-linux 共同覆盖了 Linux 操作的核心需求:

util-linux

GNU Coreutils

文件操作

文本处理

Shell 交互

磁盘分区

系统挂载

终端管理

硬件控制

完整 Linux 操作

虽然它们常被忽略(“不就是 ls 嘛”),但这两个工具集支撑了从最简单的文件查看到最复杂的系统维护工作。下次使用 mount 或 ls 时,不妨想想背后这两个默默贡献了数十年的开源项目。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐