[ 已解决 ]yast 导出的包列表我用什么办法把所有包下载到本地

类似这样的一个列表
*
*
*
*
*
*
*
* …

这个 list 是用来在另外一台机器上导入的,我也不知道如何用 zypper 直接操作 list 下载包。
唯一的想法是可以写个 bash script 解析出包名称然后用 zypper -d 参数下载

UPDATE: zypper -d 不合适,可以试着在 script 里用 wget 直接抓

你想镜像 repo 吗?

找镜像方法即可。

如果只想下载所有包。 找个下载工具把整个 repo 下载即可啊。

OSS 源 64 位
download.opensuse.org/distribution/13.1/repo/oss/suse/x86_64/

OSS 源 noarch
download.opensuse.org/distribution/13.1/repo/oss/suse/noarch/

闭源 64 位
download.opensuse.org/distribution/13.1/repo/non-oss/suse/x86_64/

闭源增量
download.opensuse.org/distribution/13.1/repo/non-oss/suse/noarch/

怎么下载? wget 递归下载。 或者 firefox 里 dta 下载, 或者把所有链接导出到文件,然后把非 rpm 的链接比如 mirrorlists 给过滤掉,然后用 xargs 导到 axel/aria2 里下载。

不过 openSUSE 的升级是增量升级。 所以说如果你想要把升级也囊括,就需要下载 update 源里面的 drpm 们。

如果想备份所有安装过的的软件包的话,我之前的做法是,在 yast 安装源里勾选保留下载软件包(我是 gnome 不知道 kde 下对应的是啥),然后定期把 /var/cache/zypp/packages 下面的包移动一个合适的位置,然后用 createrepo 来创建本地源。
同求按列表下载软件包的方法。

cat  user-packages.xml | grep -o -E 'name=".*" epoch' | grep -o -E '".*"' | sort | uniq | xargs -i sudo zypper -n in -f -d {}

下载列表中的软件包,只考虑包名不考虑版本啥的。
下载的好位置应该是/var/cache/zypp/packages,所以事先应该把这里清空。
另外只考虑包名消重后列表居然会缩小,这是说有同名的包吗~

zypper se -i | sed 's/i    | //g' | sed 's/ *|.*//g' | sed '1,6d' | sed '/201[2-4]\-[0-9]*/d'| sort | uniq | xargs -i sudo zypper -n in -f -d {}

这是直接用zypper把安装的包都列出来然后下载下来。上面的sed '1,6d’是删除zypper命令产生的前面的一些说明语句。 sed '/201[2-4]-[0-9]*/d’是因为俺用的11.4 evergreen,一些补丁可以用zypper search到但是install不行,所以这些把列表里的这些项都去掉。上面的仅供参考,可根据自己的情况调整。

感谢@styx