Core utilities (简体中文)
本文涉及 GNU/Linux 系统的所谓的 "核心" 工具,比如 less, ls, 和 grep,包括但不限于以上集成于 GNU coreutils 中的工具。下文提供了关于这些实用工具颇为丰富的技巧和有帮助的其他信息。
大多数命令行工具的文档都存放在 man page 里面,来自 GNU Project 的工具放在 Info manual 里面,一些 shell 为它的内置命令提供了 help 命令。另外,大多数命令加上 --help 参数时会显示自身的使用说明。
Contents
文件管理
| 命令 | 描述 | 手册页名称 | 示例 |
|---|---|---|---|
| cd | 变更目录(shell 内置命令) | cd(1p) | cd /etc/pacman.d |
| mkdir | 创建目录 | mkdir(1) | mkdir ~/newfolder |
| rmdir | 删除空目录 | rmdir(1) | rmdir ~/emptyfolder |
| rm | 删除文件 | rm(1) | rm ~/file.txt |
| rm -r | 删除目录和目录内文件 | rm -r ~/.cache | |
| ls | 列出文件名称 | ls(1) | ls *.mkv |
| ls -a | 列出隐藏文件 | ls -a /home/archie | |
| ls -al | 显示隐藏文件和文件属性 | ||
| mv | 移动文件 | mv(1) | mv ~/compressed.zip ~/archive/compressed2.zip |
| cp | 复制文件 | cp(1) | cp ~/.bashrc ~/.bashrc.bak |
| chmod +x | 设置文件为可执行文件 | chmod(1) | chmod +x ~/.local/bin/myscript.sh |
| cat | 显示文件内容 | cat(1) | cat /etc/hostname |
| find | 查找文件 | find(1) | find ~ -name myfile |
ls
ls 可以列出目录中的文件名称。
请参考 ls Info manual(在线版本)获取更多信息。
exa 相较于 ls 和 tree 是一个更加现代的、人性化的选择。它有更多的特性,例如将 Git 修改和文件名一同显示,在 --long 模式中对每列进行不同的着色,或者在 tree 视图中显示 --long 模式元数据。exa 可以在软件包 exa 中找到。
-l 选项(“长格式”)用于显示文件类型、权限、所有者的用户名和用户组、大小、修改时间等等,具体参阅 info document。
默认情况下,包含空格的文件名和目录名会被单引号引起。要改变这一特性,请使用 -N 或 --quoting-style=literal 选项。另外,将 QUOTING_STYLE 环境变量 设置为 literal 也可以。[1]
cat
cat 是一个将文件内容发送到标准输出的标准 Unix 工具。
如果您希望能以倒读顺序显示文件内容,有个位于 coreutils 包中的工具叫 tac (cat 倒着写)。
less
less 是一个对文本文件内容进行分页显示的终端程序,它与其他的分页显示程序如 more 和 已废弃 的 pg 相似,但 less 提供了更高级的界面和更复杂的 功能。
参阅 List of applications#Terminal pagers 查找更多可选方案。
mkdir
mkdir (make directory) 可以创建目录。
若需递归地创建一系列目录,就要用到 -p 参数,否则会出错。
用 -m 选项可直接指定新建目录的访问权限,因此不必使用 chmod 更改权限。
mv
mv (move) 可以移动或重命名文件和目录。
为了降低使用这个命令带来的风险,请为它添加一个别名:
alias mv='mv -iv'
这个别名可以在覆盖已存在的文件前要求确认,并会显示出正在进行的操作。
rm
rm (remove) 用于删除文件或目录。
为了降低使用这个命令带来的风险,请为它添加一个别名:
alias rm='rm -Iv --one-file-system'
这个别名可以在删除三个以上的文件时要求确认、显示出正在进行的操作、不跨越多个文件系统。如果想在删除一个文件时也获得确认,用 -i 代替 -I 即可。
Zsh 用户可在命令前加上 noglob,避免隐式扩展。
若要移除空目录,使用 rmdir,若内含文件则命令失败。
find
find 是 findutils 软件包的一部分, 它属于 base 软件包组。
你可能希望 find 命令将一个文件名称作为参数,并在文件系统中搜索与该名称匹配的文件。下面的 #locate 程序可以专门做这件事。
相反,find 需要一组目录,并将它们下面的每个文件与一组表达式进行匹配。这种设计为实现一些强大的“单行小程序” ("one-liners") 提供了支持,而这是上述“直观”设计无法实现的。参阅 GregsWiki:UsingFind 来获取使用说明。
locate
安装 软件包 mlocate。包里包括了一个 updatedb.timer 单元,用于每天更新数据库。这个 systemd 定时器在安装后就会 enable,如果不想重启系统就开始使用它,请手动 start。以 root 身份手动运行 updatedb 也可以更新数据库。默认会忽略 /media 和 /mnt 等路径,所以 locate 无法找到外置设备里的文件。详情请参考 updatedb(8)。
locate 命令是一个靠文件名快速查找文件的常用 Unix 工具。因为是从数据库查找而不是直接访问文件系统,所以速度比 find 快很多。而缺点是在数据库更新后创建的新文件不会被搜索到。
使用 locate 前需建立数据库,请先以 root 权限执行 updatedb。
详情参考 How locate works and rewrite it in one minute。
diff
diff 用于逐行比较文件,它的输出内容可以放到一种被称为 patch 的文件里,而这种文件可以被 patch(1) 工具所使用。Arch Linux 默认的 diff 来自 GNU diffutils,而这个软件包也包含了 cmp,可以逐字节比较文件。
另一个可以逐行比对两份已排序的文件的命令叫 comm,参阅 comm(1)。
比较文本文件时,逐个单词地比对通常更加合理:
-
git 内置的
git diff可以使用--color-words参数来实现逐词比较,使用--no-index参数来比较 Git 工作树外的文件。 - dwdiff — 一个用于 diff 程序的逐词 diff 前端,支持彩色输出。
- GNU wdiff — GNU 实现的逐词比较的 diff,不支持彩色输出。
- cwdiff — 对 GNU wdiff 的包装,使它支持彩色输出。
文本流处理
grep
grep (global/regular expression/print) 是最初给 Unix 写的命令行文字搜索工具,"grep" 命令在文件或标准输入里搜索符合指定正则表达式的行,并把结果打印到标准输出。
- 要在输出结果中显示行数,加上
-n选项。 -
grep 可以在二进制文件中查找十六进制数值,例如要查找文件中的
A1 F2,应该这样写命令:$ LANG=C grep --text --perl-regexp "\xA1\xF2" /path/to/file
参阅 Color output in console#grep 来启用彩色输出支持。
更多信息请参阅 grep(1)。
sed
sed (stream editor) 是一条专门过滤或替换文本的命令。
这个列表里有一系列现成的 sed 单行命令示范。
awk
AWK 是一种模式扫描和处理语言,存在多个实现:
- gawk — GNU 版本的 awk, 参考 gawk(1).
- https://www.gnu.org/software/gawk/ || gawk (已经包含在base中)
- nawk — 真正的 AWK 实现,参考 nawk(1).
- mawk — 一个非常快速的 AWK 实现。
- BusyBox 也包含了一个 AWK 实现。
系统管理
| 命令 | 描述 | 手册页名称 | 示例 |
|---|---|---|---|
| mount | 挂载分区 | mount(8) | mount /dev/sdc1 /media/usb |
| df -h | 显示各个分区上的剩余空间 | df(1) | |
| ps -A | 列出所有正在运行的进程 | ps(1) | |
| killall | 杀死所有运行中的进程实例 | killall(1) | |
| ss -at | 列出所有已打开的 TCP 套接字 | ss(8) |
sudo
参阅 Sudo。
which
which 显示 shell 命令的完整路径。在下面的例子中 ssh 的完整路径作为一个参数传递给了 journalctl:
# journalctl $(which sshd)
lsblk
lsblk(8) 命令会显示所有连接到系统的 块设备 和分区状况,例如:
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 vfat C4DA-2C4D /boot ├─sda2 swap 5b1564b2-2e2c-452c-bcfa-d1f572ae99f2 [SWAP] └─sda3 ext4 56adc99b-a61e-46af-aab7-a6d07e504652 /
设备名称的开头定义块设备的类型,大部分现代存储设备(如硬盘、SSD 和 USB 闪存设备)都被识别为 SCSI disks (sd)。类型后面跟着给设备编号的小写字母,第一个设备从 a 开始 (sda),第二个设备就是 b (sdb),以此类推。每个设备上的 现有 分区将用数字编号,从 1 开始 (sda1),第二个分区就是 2 (sda2),以此类推。在上面的示例中,只有一个设备可用 (sda),该设备有三个分区 (sda1 到 sda3),每个分区具有不同的 文件系统。
其它常见的块设备有 mmcblk(内存卡)或 nvme(NVMe 设备)。不清楚的设备类型可以在这里搜索到:kernel documentation。
ip
ip 显示关于网络设备,IP 地址,路由表和其他 Linux IP 软件栈的对象信息。通过附加各种命令,你可以操纵或配置大多数对象。
| 子命令 | 作用 | 手册页名称 |
|---|---|---|
| ip addr | 协议地址管理 | ip-address(8) |
| ip addrlabel | 协议地址标签管理 | ip-addrlabel(8) |
| ip l2tp | tunnel Ethernet over IP (L2TPv3) | ip-l2tp(8) |
| ip link | 网络设备配置 | ip-link(8) |
| ip maddr | 多播地址管理 | ip-maddress(8) |
| ip monitor | 监测 netlink 信息 | ip-monitor(8) |
| ip mroute | 多播路由缓存管理 | ip-mroute(8) |
| ip mrule | 多播路由策略数据库的规则 | |
| ip neigh | 邻居表/ARP 表管理 | ip-neighbour(8) |
| ip netns | process network namespace management | ip-netns(8) |
| ip ntable | 邻居表配置 | ip-ntable(8) |
| ip route | 路由表管理 | ip-route(8) |
| ip rule | 路由策略数据库管理 | ip-rule(8) |
| ip tcp_metrics | 管理 TCP Metrics | ip-tcp_metrics(8) |
| ip tunnel | 隧道配置 | ip-tunnel(8) |
| ip tuntap | 管理 TUN/TAP 设备 | |
| ip xfrm | 管理 IPsec 策略 | ip-xfrm(8) |
help 帮助命令可用于所有子命令。例如,输入 ip addr help 将显示地址对象相关的命令语法。高级用法参见 iproute2 documentation。
Network configuration (简体中文) 中提到了 ip 命令在多种实际任务中的使用方法。
ss
参阅 Network configuration#Investigate sockets。
杂项
| 命令 | 描述 | 手册页名称 | 示例 |
|---|---|---|---|
| strings | 显示二进制文件中可打印的字符 | strings(1) | strings /usr/bin/free |
dd
dd 是在 unix 和 类 unix 系统中主要用于转换和拷贝文件的命令。
iconv
iconv 可以转换文本的字符编码。
下列命令将文件 foo 从 ISO-8859-15 转换至 UTF-8,然后保存到 foo.utf:
$ iconv -f ISO-8859-15 -t UTF-8 foo > foo.utf
查阅 iconv(1) 获取更多细节。
od
od (octal dump) 命令在显示非人类可读格式时非常有用,比如程序的可执行文件,或者未格式化的设备的内容。参阅 manual 了解详情。
seq
seq (sequence) 可以打印一列数字。Shell 内置了该命令的其他替代方案,可以按照 Wikipedia 的说明进行练习。
tar
作为早期的 Unix 存档格式,.tar 文件(称为“tarballs”)广泛用于类 Unix 操作系统中的打包操作。pacman 和 AUR 软件包都是压缩的 tarball,Arch 默认使用 GNU 的 tar 程序。
对于 .tar 文件,tar 默认根据扩展名来解压文件:
$ tar xvf file.EXTENSION
强制指定格式:
| 文件类型 | 解压命令 |
|---|---|
file.tar |
tar xvf file.tar
|
file.tgz |
tar xvzf file.tgz
|
file.tar.gz |
tar xvzf file.tar.gz
|
file.tar.bz |
bzip -cd file.bz | tar xvf -
|
file.tar.bz2 |
tar xvjf file.tar.bz2bzip2 -cd file.bz2 | tar xvf -
|
file.tar.xz |
tar xvJf file.tar.xzxz -cd file.xz | tar xvf -
|
file.tar.zst |
tar -I zstd xvf file.tar.zst
|
这其中有部分 tar 的参数可以认为是历史遗留问题,但在执行某些特定的操作时仍然有用。更多细节请参阅 tar(1)。
另请参考 Archiving and compression。
wipefs
wipefs 可以列出或擦除指定设备的 文件系统、RAID 或 分区表 标志 (magic strings)。它不会擦除文件系统本身,也不会擦除设备中的任何其他数据。
更多信息请参阅 wipefs(8)。
例如,擦除 /dev/sdb 设备中的所有标志并为每个标志在 ~/wipefs-sdb-offset.bak 创建一个备份文件:
# wipefs --all --backup /dev/sdb
参考资料
- POSIX Utilities
- GNU Coreutils online documentation
- A sampling of coreutils on Reddit , part 2 , part 3 - Overview of commands in coreutils
- Learn the DD command