如何从命令行获取所有存储库和 PPA 的列表并放入安装脚本?

如何从命令行获取所有存储库和 PPA 的列表并放入安装脚本?

我知道如何列出所有包安装在我的系统上。

但是,我如何才能将所有存储库和 PPA 的列表放入脚本中,以便在新机器上运行该脚本来复制包括密钥在内的存储库设置?

我知道我可以调查/etc/apt/sources.list/etc/apt/sources.list.d但我正在寻找一种方法来产生apt-add-repository在新系统上执行所有命令的脚本(用于整理获取所有密钥)。

有任何想法吗?

答案1

你可以用以下方式显示所有内容:

grep ^ /etc/apt/sources.list /etc/apt/sources.list.d/*

答案2

谢谢你的指点。经过一些清理,我得到了一个列出 PPA 的脚本,但没有列出任何其他存储库:

listppas脚本:

#! /bin/sh 

# listppas Script to get all the PPAs installed on a system ready to share for
# reininstall

for APT in `find /etc/apt/ -name \*.list`; do
    grep -o "^deb http://ppa.launchpad.net/[a-z0-9\-]\+/[a-z0-9\-]\+" $APT \
            | while read ENTRY ; do
        USER=`echo $ENTRY | cut -d/ -f4`
        PPA=`echo $ENTRY | cut -d/ -f5`
        echo sudo apt-add-repository ppa:$USER/$PPA
    done
done

当您调用它时,listppas > installppas.sh您会得到一个installppas.sh脚本,您可以将其复制到新机器上以重新安装所有 PPA。

下一步:对其他存储库执行此操作:

最终listppas脚本:

#! /bin/sh

# Script to get all the PPAs which are installed on a system

for APT in `find /etc/apt/ -name \*.list`; do
    grep -Po "(?<=^deb\s).*?(?=#|$)" $APT | while read ENTRY ; do
        HOST=`echo $ENTRY | cut -d/ -f3`
        USER=`echo $ENTRY | cut -d/ -f4`
        PPA=`echo $ENTRY | cut -d/ -f5`
        #echo sudo apt-add-repository ppa:$USER/$PPA
        if [ "ppa.launchpad.net" = "$HOST" ]; then
            echo sudo apt-add-repository ppa:$USER/$PPA
        else
            echo sudo apt-add-repository \'${ENTRY}\'
        fi
    done
done

这应该可以解决问题。在源计算机上使用它,然后在目标计算机上listppas > installppas.sh运行的内容。installppas.sh

我需要一个关于超级用户的问题找出正确的正则表达式。

答案3

令我惊讶的是,获取所有启用的二进制软件源及其指定的文件的最简单但最有效的方法尚未发布:

grep -r --include '*.list' '^deb ' /etc/apt/sources.list /etc/apt/sources.list.d/

从所有已处理的文件中,这将打印以 开头的每一行deb。这不包括注释行以及deb-src启用源代码存储库的行。

它实际上仅搜索*.list将被解析的所有文件apt,但不*.list.save搜索用于备份的文件或其他具有非法名称的文件。


如果您想要一个更短但可能只有在 99.9% 的情况下才正确的输出,可能会搜索太多文件(包括所有/etc/apt/sources.list*文件和目录,而不仅仅是/etc/apt/sources.list`/etc/apt/sources.list.d/*),您也可以使用这个:

grep -r --include '*.list' '^deb ' /etc/apt/sources.list*

除非存在不应该存在的文件,否则输出将是相同的。


我的机器上的示例输出如下:

/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily main restricted
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates main restricted
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily universe
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates universe
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily multiverse
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates multiverse
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-backports main restricted universe multiverse
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security main restricted
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security universe
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security multiverse
/etc/apt/sources.list:deb http://archive.canonical.com/ubuntu wily partner
/etc/apt/sources.list.d/maarten-fonville-ubuntu-ppa-wily.list:deb http://ppa.launchpad.net/maarten-fonville/ppa/ubuntu wily main
/etc/apt/sources.list.d/webupd8team-ubuntu-tor-browser-wily.list:deb http://ppa.launchpad.net/webupd8team/tor-browser/ubuntu wily main
/etc/apt/sources.list.d/fossfreedom-ubuntu-indicator-sysmonitor-wily.list:deb http://ppa.launchpad.net/fossfreedom/indicator-sysmonitor/ubuntu wily main
/etc/apt/sources.list.d/getdeb.list:deb http://archive.getdeb.net/ubuntu wily-getdeb apps

如果你想要更漂亮的输出,让我们通过管道传输它sed

grep -r --include '*.list' '^deb ' /etc/apt/ | sed -re 's/^\/etc\/apt\/sources\.list((\.d\/)?|(:)?)//' -e 's/(.*\.list):/\[\1\] /' -e 's/deb http:\/\/ppa.launchpad.net\/(.*?)\/ubuntu .*/ppa:\1/'

我们将会看到这一点:

deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily main restricted
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates main restricted
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily universe
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates universe
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily multiverse
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates multiverse
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-backports main restricted universe multiverse
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security main restricted
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security universe
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security multiverse
deb http://archive.canonical.com/ubuntu wily partner
[maarten-fonville-ubuntu-ppa-wily.list] ppa:maarten-fonville/ppa
[webupd8team-ubuntu-tor-browser-wily.list] ppa:webupd8team/tor-browser
[fossfreedom-ubuntu-indicator-sysmonitor-wily.list] ppa:fossfreedom/indicator-sysmonitor
[getdeb.list] deb http://archive.getdeb.net/ubuntu wily-getdeb apps

答案4

使用add-apt-repositorysoftware-properties-common,非常简单:

add-apt-repository --list

输出可以轻松地返回给add-apt-repository命令以重新创建源。

但是,它只列出了deb来源。如果你也对 s 感兴趣ppa,那么这个问题的其他答案会更有用。

可用性

似乎该--list选项仅从 0.99.0+ 版本开始可用software-properties-common,从 Ubuntu 20.10 (Groovy) 开始默认可用。因此,您要么需要更新软件版本,要么将您的发行版升级到至少 20.10。

相关内容