![如何冻结已安装软件包列表并编写 apt-upgrade 脚本以便在之后的任何时间针对相同的软件包?](https://linux22.com/image/1177372/%E5%A6%82%E4%BD%95%E5%86%BB%E7%BB%93%E5%B7%B2%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6%E5%8C%85%E5%88%97%E8%A1%A8%E5%B9%B6%E7%BC%96%E5%86%99%20apt-upgrade%20%E8%84%9A%E6%9C%AC%E4%BB%A5%E4%BE%BF%E5%9C%A8%E4%B9%8B%E5%90%8E%E7%9A%84%E4%BB%BB%E4%BD%95%E6%97%B6%E9%97%B4%E9%92%88%E5%AF%B9%E7%9B%B8%E5%90%8C%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%8C%85%EF%BC%9F.png)
在 LXC 容器中,我希望能够记下刚刚更新的软件包,然后在之后的任何日期重新创建该情况。
我想我想做这样的事:
dpkg-query --show | sed "s/\t/=/" > somewhere_safe.txt
这将给出如下列表:
adduser=3.118
apache2=2.4.38-3+deb10u4
apache2-bin=2.4.38-3+deb10u4
apache2-data=2.4.38-3+deb10u4
apache2-utils=2.4.38-3+deb10u4
apparmor=2.13.2-10
apt=1.8.2.1
apt-listchanges=3.19
apt-transport-https=1.8.2.1
apt-utils=1.8.2.1
# and so on
然后使用一个脚本对其进行后处理,apt upgrade
该脚本将它们全部作为参数。我这样做对吗?
理由:apt update
没有“截至该日期”的参数,这意味着如果我想的话我无法重新创建某些东西,但一般来说,即使我不使用 docker 风格的图像存储库,我也希望在包方面可以重新创建一些东西。
答案1
apt list --installed | sed s/Listing...// | awk -F "/" '{print $1}' > $(date +aptlist-%m.%d.%Y-%H.%M.%S.txt)
创建列出所有已安装软件包的文件。
xargs -a ThatFileCratedAbove.txt sudo apt-get install
将从列表中安装它们
....我将首先使用模拟安装来测试文件apt-get -s install
,只是为了确保列表不会引起任何问题......(尽管这可能需要很长时间)
。
。
。
更新版本要求... 如果您想要捕获版本并能够稍后安装这些版本,那么您的 apt 列表快照需要像这样创建,而不是像上面那样:
apt list --installed | sed s/Listing...// | awk -F"[[:blank:]/]" '{ if( $1 ne '' ) print $1"="$3}' > $(date +aptlist-%m.%d.%Y-%H.%M.%S.txt)