Начиная с Fedora 26, repoquery
подкоманда Dnf поддерживает новую опцию для перечисления всех установленных пользователем пакетов:
$ 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) база данных пакетов может запрашиваться для имен установленных пользователем пакетов через API-интерфейс Dnf Python:
$ 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 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-го периода (примерно с 2015 по 2011 год) актуальны следующие проблемы):
Repoquery
В более старых системах Fedora, где Dnf, Dnf API и dnf history userinstalled
недоступны, можно вместо этого использовать 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 используется для исключения пакетов, которые были установлены установщиком. Идентификатор пользователя установщика, очевидно, был сохранен как 4294967295 - в качестве альтернативы вы можете написать что-то вроде ($3 == 0 || $3 == your-user-id)
.
Обратите внимание, что эта команда работает в Fedora вплоть до выпуска 21 - но, например, не в выпуске 23, потому что команда repoquery
была заменена на dnf repoquery
. И dnf repoquery
не понимает %{yumdb_info.reason}
тег.
repoquery ...
: «Недопустимый тег запроса yumdb 'причина' для установленного pkg: HandBrake-cli-0.9.5-1.fc14.x86_64"