Manjaro下备份已安装软件包

使用Arch系列发行版Linux系统由于经常需要滚动升级,导致稍不注意就会滚挂,影响正常使用,一旦无法修复就可能需要重新安装系统了。因此为了提高重装效率,经常备份当前已安装的软件包列表是一个非常好的习惯。在Archlinux的wiki中,就提到了如何备份和恢复已安装软件包,然而里面提到的备份方法虽然简单通用,但生成的备份列表中往往存在很多自己没有手动指定安装的软件包,即使添加了-e选项指定仅列出显式安装的软件包。这里给出一种更加精确的获取手动指定安装的软件包的方法。

命令

首先给出生成已安装软件包的命令

1
comm -12 <(cat ~/.bash_history ~/.zsh_history| grep "sudo pacman -S " | grep -v grep | awk -F'-S ' '{print $NF}' | tr ' ' '\n' | sed '/^\s*$/d' | sort | uniq) <(pacman -Qenq | sort)

说明

这条命令主要是通过读取历史命令,解析其中的安装命令来获取准确的软件安装列表。

整条命令首先是一个comm命令,两个括号是该命令的两个输入,分别是历史手动安装的软件列表和当前pacman软件包数据库中存在的显式安装的软件包列表,这条命令主要是用于过滤手动安装但后期卸载的软件包。 第一个括号中由八个小命令通过管道连接在一起,执行步骤如下

  1. cat ~/.bash_history ~/.zsh_history
    读取bash和zsh的历史记录文件,此处可根据自己的使用情况进行调整,若使用的shell有不同,可进行调整
  2. grep "sudo pacman -S "
    获取命令中包含安装指令的行
  3. grep -v grep
    过滤grep命令自身
  4. awk -F'-S ' '{print $NF}'
    -S 为分隔符,将命令分割为两部分,后一部分便是我们安装的软件包名
  5. tr ' ' '\n'
    由于我们可能一条命令一次性安装多个包,因此需要将这些包名进行分割,使得一行仅有一个包名
  6. sed '/^\s*$/d'
    移除多余的空格和空行
  7. sort
    对软件包名进行排序
  8. uniq
    删除重复的软件包

局限

  1. 若历史命令文件不完整,则无法获取到完整的已安装软件列表
  2. root或其他用户身份安装的软件无法备份

备注

  1. 根据自身的使用环境调整历史记录文件
  2. 仅支持Arch系列的发行版
  3. 通过AUR安装的软件可通过pacman -Qemq来备份