从Fedora 26开始,Dnf repoquery
子命令支持使用一个新选项来列出所有用户安装的软件包:
$ dnf repoquery --qf '%{name}' --userinstalled \
| grep -v -- '-debuginfo$' \
| grep -v '^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$' > pkgs_a.lst
与其他方法相比,它还列出了所有debuginfo软件包。上面示例中的其他grep过滤掉了它们。
要将列表安装在主机B上:
$ < pkgs_a.lst xargs dnf -y install
DNF API
使用最新的Dnf版本(例如Fedora> = 23),可以通过Dnf Python API查询软件包数据库中用户安装的软件包名称:
$ python3 -c 'import dnf; b = dnf.Base(); b.fill_sack(); \
l = sorted(set(x.name for x in b.iter_userinstalled() \
if not x.name.endswith("-debuginfo") \
and x.name not in \
["kernel-modules", "kernel", "kernel-core", "kernel-devel"] )); \
print("\n".join(l)) ' > pkgs_a.lst
# dnf install $(cat pkgs_a.lst) # on host_b
默认情况下,dnf install
如果一个或多个软件包不再可用,则中止。或者,可以强制 dnf 安装所有剩余的dnf :
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PS:将上面的代码和更多内容放入其中user-installed.py
,还支持其他发行版。
用户安装的历史记录
在Fedora 23及更高版本上,Dnf提供了
# dnf history userinstalled
列出所有用户安装的软件包的命令。从2016-11开始,它的用途受到限制,因为无法控制其输出,并且它会打印完全合格的软件包(即,包括版本信息)。
用户安装的限制
请注意,将软件包标记为用户安装在某些Fedora版本上有一些限制,对于Fedora 23-ish时代的系统(大约在2015-11年发行),存在以下问题):
回购查询
在Dnf,Dnf API和Dnf dnf history userinstalled
不可用的较旧的Fedora系统上,可以改用repoquery,例如:
$ repoquery --installed \
--qf '%{n} | %{yumdb_info.reason} | %{yumdb_info.installed_by}' --all \
| awk -F'|' ' $2 ~ /user/ && ($3 != 4294967295) { print $1 }' \
| sort -u > pkgs_a.lst
第二个awk条件用于排除安装程序安装的软件包。安装程序的用户ID显然存储为4294967295-或者,您可以编写类似的内容($3 == 0 || $3 == your-user-id)
。
请注意,此命令在Fedora发行版21之前repoquery
可用-但在23发行版上无效,因为该命令已被替换dnf repoquery
。并且dnf repoquery
不了解%{yumdb_info.reason}
标签。
repoquery ...
:“安装的pkg的yumdb querytag'原因'无效:HandBrake-cli-0.9.5-1.fc14.x86_64”