# Core utilities (简体中文)

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态：本文是 Core_Utilities 的翻译。上次翻译日期：2018-08-31。如果英文版本有所更改，则您可以帮助同步翻译。

相关文章

- Command-line shell
- General recommendations (简体中文)
- GNU
- sudo (简体中文)
- cron (简体中文)
- man page (简体中文)
- Securely wipe disk#shred
- File permissions and attributes (简体中文)
- Color output in console (简体中文)
- Archiving and compression
- chmod
- chown

本文涉及 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

This article or section needs expansion.

Reason: less 是一个复杂的家伙，这一章应该介绍一些基本的 less 命令。 (Discuss in Talk:Core utilities (简体中文)#)

less 是一个对文本文件内容进行分页显示的终端程序，它与其他的分页显示程序如 more 和 已废弃 的 pg 相似，但 less 提供了更高级的界面和更复杂的 功能。

参阅 List of applications#Terminal pagers 查找更多可选方案。

### mkdir

mkdir (make directory) 可以创建目录。

若需递归地创建一系列目录，就要用到 `-p` 参数，否则会出错。

用 `-m` 选项可直接指定新建目录的访问权限，因此不必使用 chmod 更改权限。

提示： 如果您仅仅只是想建个临时目录，也许用 mktemp: `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 软件包组。

提示： fd 是 `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 前端，支持彩色输出。

  https://os.ghalkes.nl/dwdiff.html || dwdiff

- GNU wdiff — GNU 实现的逐词比较的 diff，不支持彩色输出。

  https://www.gnu.org/software/wdiff/ || wdiff

- cwdiff — 对 GNU wdiff 的包装，使它支持彩色输出。

  https://github.com/junghans/cwdiff || cwdiffAUR, cwdiff-gitAUR

## 文本流处理

### 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)。

提示： 有专门用于检索版本控制系统（VCS）源代码的 grep 工具，例如 ripgrep、the_silver_searcher 和 ack，再加上 mgrepAUR（一个多行查找工具）。

### sed

sed (stream editor) 是一条专门过滤或替换文本的命令。

这个列表里有一系列现成的 sed 单行命令示范。

提示： awk 和 Perl 语言在这方面更为强大。

### awk

AWK 是一种模式扫描和处理语言，存在多个实现：

- gawk — GNU 版本的 awk, 参考 gawk(1).

  https://www.gnu.org/software/gawk/ || gawk （已经包含在base中）

- nawk — 真正的 AWK 实现，参考 nawk(1).

  https://www.cs.princeton.edu/~bwk/btl.mirror/ || nawk

- mawk — 一个非常快速的 AWK 实现。

  https://invisible-island.net/mawk/ || mawkAUR

- 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

This section is being considered for removal.

Reason: 与 Network configuration#Network management 和 ip(8) 重复。表格没有价值，文档链接失效。 (Discuss in Talk:Core utilities (简体中文)#Rewrite)

ip 显示关于网络设备，IP 地址，路由表和其他 Linux IP 软件栈的对象信息。通过附加各种命令，你可以操纵或配置大多数对象。

注意： ip 命令在 iproute2 包中提供，这个包已经包含在 base 组。

子命令 | 作用 | 手册页名称
--- | --- | ---
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 命令在多种实际任务中的使用方法。

注意： 你也许很熟悉旧版 Linux 中的 ifconfig 命令。在 Arch Linux 中现已不再使用；应当用 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) 获取更多细节。

提示： 如果你不想改变文件的修改时间，可以用 recode 代替 iconv。

### od

od (octal dump) 命令在显示非人类可读格式时非常有用，比如程序的可执行文件，或者未格式化的设备的内容。参阅 manual 了解详情。

### seq

seq (sequence) 可以打印一列数字。Shell 内置了该命令的其他替代方案，可以按照 Wikipedia 的说明进行练习。

### tar

This section is being considered for removal.

Reason: 与 Archiving and compression#Archiving only 重复，表格没有价值，因为 tar 可以自动检测文件格式。 (Discuss in Talk:Core utilities (简体中文)#Rewrite)

作为早期的 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)。

注意： 虽然 GNU 的 tar 是默认的 tar 程序，但是官方 Arch Linux 项目（如 pacman 和 mkinitcpio）使用的是 libarchive 包中的 bsdtar。

另请参考 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

Category:

- Command-line (简体中文)

Hidden categories:

- Pages or sections flagged with Template:Expansion
- Sections flagged with Template:Remove