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
软件包数据库中存在的显式安装的软件包列表,这条命令主要是用于过滤手动安装但后期卸载的软件包。 第一个括号中由八个小命令通过管道连接在一起,执行步骤如下
cat ~/.bash_history ~/.zsh_history
读取bash和zsh的历史记录文件,此处可根据自己的使用情况进行调整,若使用的shell有不同,可进行调整grep "sudo pacman -S "
获取命令中包含安装指令的行grep -v grep
过滤grep命令自身awk -F'-S ' '{print $NF}'
以-S
为分隔符,将命令分割为两部分,后一部分便是我们安装的软件包名tr ' ' '\n'
由于我们可能一条命令一次性安装多个包,因此需要将这些包名进行分割,使得一行仅有一个包名sed '/^\s*$/d'
移除多余的空格和空行sort
对软件包名进行排序uniq
删除重复的软件包
局限
- 若历史命令文件不完整,则无法获取到完整的已安装软件列表
- 以
root
或其他用户身份安装的软件无法备份
备注
- 根据自身的使用环境调整历史记录文件
- 仅支持Arch系列的发行版
- 通过
AUR
安装的软件可通过pacman -Qemq
来备份