00. Pacman常用命令

0000. 安装软件包

$ sudo pacman -S package_name # 安装软件包
$ sudo pacman -S $(pacman -Ssq package_regular_expression) # 通过包正则表达式安装一系列软件包
$ sudo pacman -S repo_name/package_name # 安装指定仓库的软件包
$ sudo pacman -S gnome # 安装gnome包组内所有软件包
$ pacman -Sg gnome # 查看属于包组gnome的所有包

Tip

有的包组包含大量的软件包,有时用户只需其中几个。除了逐一键入序号外,pacman 还支持选择或排除某个区间内的的软件包: Enter a selection (default=all): 1-10 15 这将选中序号 1 至 10 和 15 的软件包。而 Enter a selection (default=all): ^5-8 ^2 将会选中除了序号 5 至 8 和 2 之外的所有软件包。

Tip

如果列表中的包已经安装在系统中,它会被重新安装,即使它已经是最新的。可以用 --needed 选项覆盖这种行为。

Warning

在 Arch 上安装软件包时,请避免在还没有更新系统前刷新同步软件包列表(例如,当官方软件仓库不再提供某个软件包时)。实际操作上,请使用 pacman -Syu _软件包名_, 而不要使用 pacman -Sy _软件包名_,因为后者可能会导致依赖问题。参见 System maintenance#不支持部分升级一文和 BBS#89328 论坛讨论

0001. 删除软件包

$ sudo pacman -R package_name # 删除软件包,保留其全部已经安装的依赖关系
$ sudo pacman -Rs package_name # 删除软件包,及其所有没有被其他已安装软件包使用的依赖包
$ sudo pacman -Rsu package_name # 在上一条指令被拒绝时运行
$ sudo pacman -Rsc package_name # 递归删除软件包及所有依赖这个包的程序(千万小心使用)
$ sudo pacman -Rdd pkg_name # 删除一个被其他软件包所依赖的软件包,但不删除依赖这个软件包的其他软件包(此命令也很危险,尽量避免使用)
$ sudo pacman -Rn pkg_name # pacman删除某些程序时会备份重要配置文件,在其后添加`.pacsave`扩展名,使用-n选项可以避免备份这些文件

0002. 升级软件包

$ sudo pacman -Syyu # 升级系统,同步远程软件仓库并升级系统的软件包 -yy:标记强制刷新、-u:标记升级动作

Warning

0003. 查询软件包

pacman 使用 -Q 参数查询本地软件包数据库, -S 查询同步数据库,以及 -F查询文件数据库。要了解每个参数的子选项,分别参见 pacman -Q --helppacman -S --helppacman -F --help

$ pacman -Ss string1 string2 # 在同步数据库中搜索包,包括包的名称和描述
$ pacman -Si pkg_name # 显示软件包的详细信息
 
$ pacman -Qs package_name # 检查已安装包的相关信息。-Q:查询本地软件包数据库
$ pacman -Qi pkg_name # 查询本地安装包的详细信息
$ pacman -Qii pkg_name # 同时显示备份文件和修改状态
$ pacman -Ql pkg_name # 获取已安装软件包所含文件的列表
$ pacman -Qk pkg_name # 查询软件包安装的文件是否都存在
$ pacman -Qo /path/to/file_name # 查询数据库获取参数中文件属于那个软件包
$ pacman -Qdt # 找出孤立包。-d:标记依赖包、-t:标记不需要的包、-dt:合并标记孤立包
$ pacman -Qet # 罗列所有明确安装且不被其他包依赖的软件包
$ sudo pacman -Rns $(pacman -Qtdq) #  组合命令,删除孤立包
 
$ pacman -F string1 string2 # 按文件名查找软件库
$ pacman -Fy # 更新命令查询文件列表数据库
$ pacman -Fl pkg_name # 查询远程库中软件包包含的文件

0004. 依赖查询

$ pactree package_name # 查看一个包的依赖树(需要安装pacman-contrib才能使用)
$ pactree -r pkg_name # 查看一个包被哪些软件包所依赖

0005. 数据库结构

pacman数据库通常位于 /var/lib/pacman/sync. 对于每一个在/etc/pacman.conf中指定的软件仓库, 这里都有一个一致的数据库。数据库文件夹里每个tar.gz文件都包含着一个仓库的软件包信息。例如which包:

$ tree which-2.21-5
 
which-2.21-5
|-- desc

这个 depends 项列出了该软件的依赖包, 而desc有该包的介绍,例如文件大小和MD5值 。

0006. 清理软件包缓存

pacman 将下载的软件包保存在 /var/cache/pacman/pkg/ 并且不会自动移除旧的和未安装版本的软件包。这样做有一些好处:

  1. 这样允许降级软件包而不需要通过其他方式提取旧版本,例如 Arch Linux Archive.
  2. 被卸载的软件包可以轻易地直接从缓存文件夹重新安装,不需要重新从软件仓库下载。

然而,需要定期手动清理缓存来避免该文件夹无限制增大。

pacman-contrib包 提供的 paccache(8) 脚本默认会删除所有缓存的版本和已卸载的软件包,除了最近的3个会被保留:

$ paccache -r

启用 (systemctl enable)和 启动 (systemctl start)paccache.timer来每周删除不使用的包。

Tip

提示: 可以使用钩子自动执行清理,安装 pacman-cleanup-hookAUR 参考[1]

也可以自己设置保留最近几个版本:

$ paccache -rk1

添加-u/--uninstalled开关来限制paccache的行为只作用于卸载的包。例如清理所有卸载的包的缓存版本,可以用以下命令:

$ paccache -ruk0

更多参数参见paccache -h

pacman也有一些内建参数用于清除缓存和那些不再在/etc/pacman.conf配置文件中列出的软件仓库残留数据库文件。然而 pacman 并不提供保留一定数量的过去版本的功能,因此它比 paccache 的默认选项更加激进。

要删除目前没有安装的所有缓存的包,和没有被使用的同步数据库,执行:

$ pacman -Sc

要删除缓存中的全部文件,使用两次-c开关。这是最为激进的方式,将会清空缓存文件夹:

$ pacman -Scc

Warning

警告: 应当避免从缓存中删除所有过去版本和卸载的包,除非需要更多磁盘空间。这样会导致无法降级或重新安装包而不再次下载他们

pkgcacheclean以及pacleaner是两个进一步清理缓存的替代工具。

0007. 其他命令

下载包而不安装它:

$ pacman -Sw package_name

安装一个本地包(不从源里下载):

$ pacman -U /path/to/package/package_name-version.pkg.tar.zst

要将本地包保存至缓存,可执行:

$ pacman -U file://path/to/package/package_name-version.pkg.tar.zst

安装一个远程包(不在 pacman 配置的源里面):

$ pacman -U  http://www.example.com/repo/example.pkg.tar.zst

要禁用 -S-U 和 -R 动作,可以使用 -p 选项. pacman 会列出需要安装和删除的软件,并在执行动作前要求需要的权限。 进一步查看:pacman ArchWiki

0008. yay

yay用法和pacman基本一致,有几条额外常用命令值得注意:

$ yay # 等同于 yay -Syu
$ yay package_name # 等同于 yay -Ss package_name && yay -S package_name
$ yay -Ps # 打印系统统计信息
$ yay -Yc # 清理不需要的依赖