Desde Fedora 26, el Dnf repoquery
subcomando admite una nueva opción para enumerar todos los paquetes instalados por el usuario:
$ dnf repoquery --qf '%{name}' --userinstalled \
| grep -v -- '-debuginfo$' \
| grep -v '^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$' > pkgs_a.lst
A diferencia de otros métodos, también enumera todos los paquetes de debuginfo. El grep adicional en el ejemplo anterior los filtra.
Para instalar la lista en el host B:
$ < pkgs_a.lst xargs dnf -y install
API de Dnf
Con las versiones recientes de Dnf (por ejemplo, Fedora> = 23), la base de datos de paquetes puede consultarse por los nombres de paquetes instalados por el usuario a través de la API de 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
Por defecto, dnf install
aborta si uno o más paquetes ya no están disponibles. Alternativamente, dnf puede verse obligado a instalar todos los restantes:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PD: Ponga el código anterior y más enuser-installed.py
eso también es compatible con otras distribuciones.
historial instalado por el usuario
En Fedora 23 y posterior, Dnf proporciona el
# dnf history userinstalled
comando que enumera todos los paquetes instalados por el usuario. A partir de 2016-11, su utilidad es limitada porque no hay forma de controlar su salida e imprime paquetes totalmente calificados (es decir, que incluye información de versión).
Limitaciones instaladas por el usuario
Tenga en cuenta que el marcado de paquetes como instalados por el usuario tiene algunas limitaciones en algunas versiones de Fedora, para los sistemas Fedora 23-ish era (de alrededor de 2015-11) los siguientes problemas son relevantes):
Repoquery
En sistemas Fedora más antiguos, donde Dnf, la API de Dnf y dnf history userinstalled
no están disponibles, uno puede usar repoquery , por ejemplo:
$ 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
La segunda condición awk se usa para excluir paquetes que fueron instalados por el instalador. La identificación de usuario del instalador aparentemente se almacenó como 4294967295; alternativamente, puede escribir algo como ($3 == 0 || $3 == your-user-id)
.
Tenga en cuenta que este comando funciona en Fedora hasta la versión 21, pero, por ejemplo, no en la versión 23, porque el comando repoquery
fue reemplazado por dnf repoquery
. Y dnf repoquery
no entiende la %{yumdb_info.reason}
etiqueta.
repoquery ...
: "Motivo de consulta inválido yumdb 'razón' para el paquete instalado: HandBrake-cli-0.9.5-1.fc14.x86_64"