Core utilities (简体中文)
本文涉及 GNU/Linux 系统的所谓的 "核心" 工具,比如 less, ls, 和 grep,包括但不限于以上集成于 GNU coreutils 中的工具。下文提供了关于这些实用工具颇为丰富的技巧和有帮助的其他信息。
大多数命令行工具的文档都存放在 man page 里面,来自 GNU Project 的工具放在 Info manual 里面,一些 shell 为它的内置命令提供了 help
命令。另外,大多数命令加上 --help
参数时会显示自身的使用说明。
文件管理
命令 | 描述 | 手册页名称 | 示例 |
---|---|---|---|
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 更改权限。
mktemp -d
更好。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
的一个更加简单、快速、友好的替代方案,它有着更合理的默认值(比如忽略隐藏文件、文件夹和 .gitignore
等文件,可用 fd PATTERN
代替 find -iname '*PATTERN*'
)。它具有彩色输出(类似 ls
),unicode 支持,正则表达式支持等等。你可能希望 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。
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.bz2 bzip2 -cd file.bz2 | tar xvf -
|
file.tar.xz |
tar xvJf file.tar.xz xz -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