如果你使用 Arch Linux,你可能已经注意到,一段时间后,尤其是在系统更新之后,.pacnew系统中会出现一些扩展名为 .ts 的文件。既然你在阅读这篇文章,很可能就是因为这些文件是什么、为什么会出现以及应该如何处理它们才来到这里。
嗯,你来对地方了。接下来,我会尽量用清晰明了的方式解释一切。那么,让我们从最主要的问题开始。
Arch Linux 中的 .pacnew 文件是什么?
当您通过执行类似 `npm update` 的命令更新 Arch Linux 系统时pacman -Syu,一些已安装的软件包会包含配置文件,/etc这些文件通常存储在 `/etc/archive/` 目录中。但是,如果您自定义了其中一个文件,并且软件包维护者在更新版本中对其进行了更改,Arch(当然)不会覆盖您本地安装的版本。
这是一项安全措施,可以防止您本地的更改丢失。实际上,Pacman 会在后台创建一个.pacnew文件——一个随更新后的软件包一起发布的“新”配置文件版本,从而使您能够访问软件包现在提供的最新配置。您可以这样理解:
- 您当前的配置 = 您的自定义设置。
- 该
.pacnew文件 = 维护者更新的版本。
例如,如果/etc/pacman.conf上游文件已修改,更新后您会看到更改/etc/pacman.conf.pacnew。然后您可以并排打开这两个文件(详见下文),并将重要的差异复制过来。
合并或替换文件后,您可以安全地删除旧版本,以保持系统整洁。最终目标是在不丢失自定义设置的.pacnew前提下,保持系统配置的最新状态。如果您想知道如何进行合并操作,请继续阅读。实际上,这非常简单。
如何在 Arch Linux 中比较和合并 .pacnew 文件
理论部分讲解完毕,现在是时候动手实践了。不出所料,第一步是检查.pacnewArch 系统中存在哪些文件。为此,Arch 提供了一个名为 `arch` 的便捷小工具pacdiff,它可以帮你找到这些文件。
虽然它不是默认包含的——它是pacman-contrib软件包的一部分,所以我们先来安装它。
sudo pacman -S pacman-contrib代码语言: Bash (bash )
很简单,对吧?现在一切准备就绪pacdiff,让我们来看看.pacnewArch系统上所有可用的文件。
pacdiff -o代码语言: Bash (bash )

如上图所示,系统更新悄悄创建了六个.pacnew文件——它们就放在那里,等着我们处理。接下来我们可以这样做。
最简单也最显而易见的做法——你可能已经想到了——就是直接复制(或移动).pacnew文件覆盖原文件。例如:
cp /etc/example.conf.pacnew /etc/example.conf代码语言: Bash (bash )
然后,你可以删除该.pacnew文件并继续操作。当然,在某些情况下这可能有效,但通常来说,这不是个好主意,我强烈建议不要这样做。
原因如下:首先,这种方法完全不会让你了解新版本究竟改动了什么。你只是盲目地相信它不会出问题。其次,这种方法只有在你绝对确定自己之前没有修改过该文件的情况下才有效——我是说真的只有在——因为如果你修改过该文件,你所有宝贵的手动修改都会丢失。
但最重要的是,你是 Arch 用户(顺便一提)。这意味着你应该不会遇到一些用户在使用命令行时经常遇到的问题(很遗憾)。所以,我建议你不要走捷径,而是遵循一套正确且一致的.pacnew文件处理流程,我马上就给你演示一下。
要比较原始文件与其版本之间的差异.pacnew,并合并所有更改,您可以使用软件包vimdiff自带的便捷工具vim。如果您尚未安装该工具,只需运行:
sudo pacman -S vim代码语言: Bash (bash )
我知道很多人肯定会抱怨,所以为什么不简化一下,使用市面上众多可用的图形界面应用程序呢?原因很简单——这些程序通常会引入大量额外的依赖项,例如 Qt 或 GTK(具体取决于你的桌面环境),这并非适用于所有配置。我更倾向于通用解决方案,而对于这项工作来说,基于终端的工具vimdiff就非常合适。
因此,请执行以下操作,默认情况下pacdiff将调用vimdiff:
sudo pacdiff代码语言: Bash (bash )

需要说明的是,此函数会.pacnew逐个处理找到的所有文件。遗憾的是,pacdiff它本身并不接受文件名参数。关键在于你可用的选项:
- (查看):打开当前文件与版本并排比较
.pacnew。 - (M)erge:尝试以
.pacnew交互方式合并新文件和现有文件。 - (S)kip:暂时忽略此文件,直接处理下一个文件。
- (R)删除 pacnew:删除
.pacnew文件而不触及您当前的配置。 - 使用 pacnew 覆盖:将现有配置文件替换为
.pacnew指定版本。 - (Q)退出:立即退出,
pacdiff不处理剩余文件。
当然,下一步是查看差异。按“ v ”,按“ Enter ”,您将进入下一个vimdiff屏幕,显示找到的第一个文件pacdiff——在本例中是/etc/hosts。

需要记住的关键一点是,因为它构成了我们接下来操作的基础,那就是左侧窗格显示文件.pacnew,而右侧窗格显示您当前的原始文件,也就是系统实际正在使用的文件。
在这里,您可以使用强大的命令在两个比较的文件之间移动更改diff,dp并且do。
dp将当前文件中的差异复制到另一个文件中。可以这样理解:“我想把这个更改推送到另一个文件。”do将另一个文件中的差异复制到当前文件中。可以这样理解:“我想把这个差异复制到这里。”
只需将光标移到不同的行,然后输入上述两个命令之一即可进行所需的更改。完成后,输入 Vim 命令:wqa(write and quit all )并按“ Enter ”键——这将带您返回主屏幕。

由于我们已经应用了所有编辑,因此可以安全地删除该.pacnew文件,只需输入r,然后按“回车”键即可。文件将被删除,并pacdiff自动进入下一个文件,届时系统会再次询问您下一步要执行的操作。

如您所见,您可以通过合并或直接覆盖文件来跳过所有这些步骤,但我强烈建议不要这样做。最安全(也最专业)的做法是亲自检查每一项更改,并决定如何处理。
最后,简单提一下:在比较模式下(vimdiff),您可以按 键在窗格之间切换Ctrl + W,然后使用左箭头键或右箭头键将光标移动到所需的窗格。
结论
文件管理.pacnew是维护健康稳定 Arch Linux 系统的重要组成部分。正如您已经了解到的,这些文件表面上是为了保护您的自定义配置不被覆盖,但它们也表明上游代码发生了变化。您需要自行审查并决定如何整合这些变化。

