在全新安装 Ubuntu 操作系统后获取软件包名称(未更改)。重新安装初始软件包并删除添加的附加软件包

在全新安装 Ubuntu 操作系统后获取软件包名称(未更改)。重新安装初始软件包并删除添加的附加软件包

我正处于了解/学习 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

编辑:

  1. 已安装 Ubuntu 18.04.3

  2. apt list --installed

  3. 用脚本保存那些包名称只说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个月..

  2. 在这 1 个月内,我安装了大约 50 个软件包,并损坏了最初 100 个软件包中的部分软件包。

  3. 此时我apt install --reinstall those 100 packages需要apt purge those extra 50 packages added

答案1

我编写了一个 Python 3 脚本,它使用 Python 函数以及一些 Bash 命令。

先决条件:

  1. 应该安装 Ubuntu。脚本未针对 Kubuntu、Lubuntu 或其他版本进行修改。

  2. curl应该已安装。如果未安装,请使用以下命令进行安装:

    sudo apt install curl
    
  3. 用户必须使用当前支持的版本,即它应该已经达到标准支持的结束。
  4. 如果您使用的是 LTS 版本,则应将其更新到最新版本。例如,在撰写此答案时,18.04.3 已发布。因此,您应该运行相同的版本,因为很难找到 18.04、18.04.1 或 18.04.2 的清单。
  5. 需要互联网连接才能下载清单。

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 提示时输入密码并输入“是”,否则脚本不会删除任何软件包。

相关内容