Core utilities (简体中文)

From ArchWiki
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。如果英文版本有所更改,则您可以帮助同步翻译。

本文涉及 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 相较于 lstree 是一个更加现代的、人性化的选择。它有更多的特性,例如将 Git 修改和文件名一同显示,在 --long 模式中对每列进行不同的着色,或者在 tree 视图中显示 --long 模式元数据。exa 可以在软件包 exa 中找到。

-l 选项(“长格式”)用于显示文件类型、权限、所有者的用户名用户组、大小、修改时间等等,具体参阅 info document

默认情况下,包含空格的文件名和目录名会被单引号引起。要改变这一特性,请使用 -N--quoting-style=literal 选项。另外,将 QUOTING_STYLE 环境变量 设置为 literal 也可以。[1]

cat

cat 是一个将文件内容发送到标准输出的标准 Unix 工具。

如果您希望能以倒读顺序显示文件内容,有个位于 coreutils 包中的工具叫 tac (cat 倒着写)。

less

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

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

findfindutils 软件包的一部分, 它属于 base 软件包组。

提示: fdfind 的一个更加简单、快速、友好的替代方案,它有着更合理的默认值(比如忽略隐藏文件、文件夹和 .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 工具,例如 ripgrepthe_silver_searcherack,再加上 mgrepAUR(一个多行查找工具)。

sed

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

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

提示: awkPerl 语言在这方面更为强大。

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),该设备有三个分区 (sda1sda3),每个分区具有不同的 文件系统

其它常见的块设备有 mmcblk(内存卡)或 nvmeNVMe 设备)。不清楚的设备类型可以在这里搜索到:kernel documentation

ip

Tango-edit-cut.pngThis section is being considered for removal.Tango-edit-cut.png

Reason:Network configuration#Network managementip(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

Tango-edit-cut.pngThis section is being considered for removal.Tango-edit-cut.png

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

作为早期的 Unix 存档格式,.tar 文件(称为“tarballs”)广泛用于类 Unix 操作系统中的打包操作。pacmanAUR 软件包都是压缩的 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 项目(如 pacmanmkinitcpio)使用的是 libarchive 包中的 bsdtar

另请参考 Archiving and compression

wipefs

wipefs 可以列出或擦除指定设备的 文件系统RAID分区表 标志 (magic strings)。它不会擦除文件系统本身,也不会擦除设备中的任何其他数据。

更多信息请参阅 wipefs(8)

例如,擦除 /dev/sdb 设备中的所有标志并为每个标志在 ~/wipefs-sdb-offset.bak 创建一个备份文件:

# wipefs --all --backup /dev/sdb

参考资料