背景
我有一个双启动的 Windows 10/Ubuntu 16.04 系统。然后我使用 18.04 对其进行了三重启动。然后我在 Ubuntu 16.04 系统内的 Vitualbox VM 中添加了 Lubuntu 16.04。
在此过程中的某个地方,我迷路了,删除了/usr
而不是usr
。然后以为18.04
是新同步到16.04
我复制了这些文件/usr
并最终得到了 Frankenstein 16.04/18.04。
所以我创建了一个实时的 USB 16.04.4,并从中复制了/usr
目录。幸运的是,我最终得到了一个 16.04.4/16.04.5 混合版本,其中还混入了一些 18.04。
我的apt
坏了但dpkg
还能用,所以我用它重新安装,apt
但它却是不同的版本。
我清除了 18.04 分区并安装了 16.04.5 的新副本。我安装了一些随机应用程序,例如、、、,conky
可能dialog
还有其他几个。gimp
vnstat
yad
因为我仍然可以挂载我的旧 16.04 分区,如何获取仍需要安装在我的新 16.04 分区上的软件包列表(不包括库和 Linux 内核)?
答案1
的力量dpkg
,diff
和grep
我的回答基于以下问答:设置两台机器上安装的软件包的差异. 不同之处在于:
- 有两个不同的分区,而不是两个不同的服务器
apt
在我的旧 16.04 分区中损坏了,因此dpkg
改用
我挂载了旧的 16.04 分区/mnt/old
并输入了以下内容:
/mnt/old$ dpkg --admindir=var/lib/dpkg --get-selections|sort > ~/installed-old
/mnt/old$ dpkg --admindir=/var/lib/dpkg --get-selections|sort > ~/installed-new
/mnt/old$ diff -u ~/installed-old ~/installed-new > ~/compare-old-new
/mnt/old$ cat ~/compare-old-new | grep '^-' | grep -v -e '^-lib' -e '^-linux' | wc -l
257
因此可能有 257 个包需要重新安装,但其中许多包将由依赖于它们的包自动安装。
清单内容
cat ~/compare-old-new | grep '^-' | grep -v -e '^-lib' -e '^-linux'
以下是使用该命令时的列表片段:
-mesa-utils install
-mesa-vdpau-drivers:amd64 install
-milou install
-mkusb-common install
-mkusb install
-mkusb-nox install
-module-init-tools install
-mutter-common install
-mutter install
-mysql-common install
-nasm install
-nautilus-hide install
-nautilus-image-converter install
-ntrack-module-libnl-0 deinstall
-nvidia-384 deinstall
-nvidia-390 deinstall
-nvidia-opencl-icd-384 deinstall
-nvidia-opencl-icd-390 deinstall
-nvidia-prime deinstall
-nvidia-settings deinstall
-nvme-cli install
-ocl-icd-libopencl1:amd64 install
-oracle-java8-installer install
-oracle-java8-set-default install
-oxideqt-codecs:amd64 install
-oxygen5-icon-theme deinstall
-pavucontrol install
-peek install
大部分截图都是为了回答问题而安装的软件包询问 Ubuntu。从此代码片段我只需要重新安装:mesa-utils
,,,和。mutter
nvme-cli
pavucontrol
peek
带有品牌标识的软件包deinstall
可以被忽略:dpkg --get-selections 显示标记为“deinstall”的软件包