我正处于了解/学习 Ubuntu 操作系统的初始阶段..从 17.04 版本开始使用 Ubuntu..
在学习的过程中,我曾多次重新安装已安装的操作系统,从而破坏了操作系统。我觉得重新安装操作系统非常耗时。
想法:
比如说,当我安装操作系统 Ubuntu 18.04.3 最小安装时。我将运行apt list --installed
,它会给出一些包名称。
例如,上述命令的一部分是
libperlio-gzip-perl/bionic,now 0.19-1build3 amd64 [installed,automatic]
libpgm-5.2-0/bionic,now 5.2.122~dfsg-2 amd64 [installed,automatic]
libphonenumber7/bionic,now 7.1.0-5ubuntu5 amd64 [installed,automatic]
libpipeline1/bionic,now 1.5.0-1 amd64 [installed,automatic]
libpixman-1-0/bionic,now 0.34.0-2 amd64 [installed,automatic]
libplist3/bionic,now 2.0.0-2ubuntu1 amd64 [installed,automatic]
libplymouth4/bionic-updates,now 0.9.3-1ubuntu7.18.04.2 amd64 [installed,automatic]
libpng16-16/bionic-updates,bionic-security,now 1.6.34-1ubuntu0.18.04.2 amd64 [installed,automatic]
libpolkit-agent-1-0/bionic-updates,bionic-security,now 0.105-20ubuntu0.18.04.5 amd64 [installed,automatic]
libpolkit-backend-1-0/bionic-updates,bionic-security,now 0.105-20ubuntu0.18.04.5 amd64 [installed,automatic]
libpolkit-gobject-1-0/bionic-updates,bionic-security,now 0.105-20ubuntu0.18.04.5 amd64 [installed,automatic]
libpoppler-glib8/bionic-updates,bionic-security,now 0.62.0-2ubuntu2.10 amd64 [installed,automatic]
几天后,我会在规定的时间和要求下安装额外的软件包。我有一个坏习惯,就是为了尝试不同的东西而编辑软件包内容。
在安装 Ubuntu 18.04.3 时,我有 100 个新软件包,几天后我有 150 个。
有没有办法存储操作系统全新安装后最初可用的软件包名称。然后编写一个脚本来重新安装这些软件包并删除额外添加的 50pkgs?
注意:我有高速互联网,具备所需的数据容量来下载/重新安装所有 100 个软件包。
这可以通过脚本实现吗?
喜欢
apt purge remove those extra 50 packages added
apt autoremove && apt autoclean
apt install --reinstall those initial 100 packages
编辑:
已安装 Ubuntu 18.04.3
apt list --installed
用脚本保存那些包名称只说pkg1 pkg2 .... pkg 99 pkg100。
例如:下面几行是一些输出,apt list --installed
所以我正在寻找一种方法将 pkg 名称保存zenity zenity-common zip zlib1g
在文本文件中,以便我可以使用它们sudo apt install --reinstall zenity zenity-common zip zlib1g
zenity/bionic,now 3.28.1-1 amd64 [installed,automatic]
zenity-common/bionic,bionic,now 3.28.1-1 all [installed,automatic]
zip/bionic,now 3.0-11build1 amd64 [installed,automatic]
zlib1g/bionic,now 1:1.2.11.dfsg-0ubuntu2 amd64 [installed,automatic]
工作1个月..
在这 1 个月内,我安装了大约 50 个软件包,并损坏了最初 100 个软件包中的部分软件包。
此时我
apt install --reinstall those 100 packages
需要apt purge those extra 50 packages added
答案1
我编写了一个 Python 3 脚本,它使用 Python 函数以及一些 Bash 命令。
先决条件:
应该安装 Ubuntu。脚本未针对 Kubuntu、Lubuntu 或其他版本进行修改。
curl
应该已安装。如果未安装,请使用以下命令进行安装:sudo apt install curl
- 用户必须使用当前支持的版本,即它应该已经达到标准支持的结束。
- 如果您使用的是 LTS 版本,则应将其更新到最新版本。例如,在撰写此答案时,18.04.3 已发布。因此,您应该运行相同的版本,因为很难找到 18.04、18.04.1 或 18.04.2 的清单。
- 需要互联网连接才能下载清单。
Python 3 脚本:
#!/usr/bin/env python3
import os
import subprocess
def main():
#Find release number
a=str(subprocess.check_output("lsb_release -sr", shell=True))[2:7]
#Check if it is LTS
if(a[3:5]=='04' and int(a[0:2])%2==0):
print("Since you are using LTS release, is your Ubuntu up to date? Enter 'yes' to continue.", end=" ")
b=input()
if(b!='yes'):
return
b=str(subprocess.check_output("lsb_release -sd", shell=True))[9:16]
#Download manifest and extract the package names by removing architecture and version string
l = os.system('curl -s http://releases.ubuntu.com/' + a + '/ubuntu-' + b + '-desktop-amd64.manifest > 1.txt; sed -i "s/\t.*//g" 1.txt; sed -i "s/:.*//g" 1.txt')
else:
l= os.system('curl -s http://releases.ubuntu.com/' + a + '/ubuntu-' + a + '-desktop-amd64.manifest > 1.txt; sed -i "s/\t.*//g" 1.txt; sed -i "s/:.*//g" 1.txt')
#Get default packages in a set
packages_initial={line.strip() for line in open("1.txt", 'r')}
l=os.system('apt list --installed > 2.txt 2> /dev/null; sed -i "s/\/.*//g" 2.txt')
#Get currently installed packages in a set
packages_installed={line.strip() for line in open("2.txt", 'r')}
#Packages that are manually installed
l=packages_installed-packages_initial
#Converting list into a string separated by space to pass to APT commands
to_be_removed=' '.join(l)
#Package count to be removed
print(len(l), "packages will be removed.")
#Removing those packages
os.system('sudo apt purge '+ to_be_removed+'; sudo apt autoclean; sudo apt autoremove')
#Install any default package that might have been deleted because of dependencies
os.system('sudo apt install '+' '.join(packages_initial.intersection(packages_installed)))
#Cleanup
os.system('rm 1.txt 2.txt')
main()
我也将此脚本上传到了 GitHub。你可以使用以下命令下载并运行该脚本
wget https://raw.githubusercontent.com/kulfy1/remove-manually-installed-packages/master/script.py
chmod +x script.py
./script.py
解释:
上述脚本将下载清单文件,该文件包含默认安装的软件包的名称。将创建一个包含这些软件包名称的列表。将创建另一个包含当前安装的软件包名称的列表。APT 将删除手动安装的、不在先前列表中的软件包。删除软件包后,如果由于某些原因被删除,则会安装这些列表中常见的软件包。
脚注:
APT 命令的提示(例如密码和删除/安装软件包的确认)应由用户处理,但脚本不会处理这些提示,因为用户可能并不想真正删除这些软件包。由于脚本不是以 sudo 权限运行的,因此,除非在 APT 提示时输入密码并输入“是”,否则脚本不会删除任何软件包。