Buscar archivos no instalados por el administrador de paquetes RPM

9

¿Hay alguna forma de averiguar todos los archivos en un sistema dado que no se instalaron a través de RPM? Entiendo que puedo forzarlo por mí mismo usando algo como rpmquery -fen un script que recorre todos los archivos del sistema de archivos, sin embargo, me preguntaba si hay alguna forma estándar de hacer esto para los sistemas basados ​​en RPM (específicamente Fedora, que uso en casa). Dado que esto es para Fedora, está bien usarlo yumo dnfresolverlo.

Si no hay una forma estándar de hacerlo, ¿alguien sabe de algunos scripts preexistentes para hacerlo? No quiero reinventar la rueda si no lo necesito.

PD: Hay otra pregunta similar a esta , pero se trata de Gentoo y Portage, por lo que no es totalmente relevante.

eestrada
fuente
Por curiosidad, ¿cuál sería el caso de uso real?
doktor5000
1
@ doktor5000 Tengo un escritorio para el hogar al que he agregado una buena cantidad de software de terceros en los últimos años. En lugar de tratar de rastrear a mano cada archivo que instalé fuera de rpm, sería bueno obtener una lista de esos archivos para saber qué copiar manualmente, reinstalar cuando actualizo mi sistema o simplemente ignorarlo. Tengo mala suerte cuando intento actualizaciones en el lugar de Fedora, por lo que tiendo a reinstalar totalmente nuevo.
eestrada
Bueno, entonces tal vez sería más fácil limitarse primero a paquetes rpm que no vienen con los repositorios base. Además, otro software se instala comúnmente en / usr / local de forma predeterminada o en / opt, lo que debería ser bastante fácil de verificar, ya que no es utilizado por los paquetes de distribución normales. Para rutas estándar como / usr / bin, / usr / share o / usr / lib y similares, probablemente deba recurrir a uno de los métodos de scriptlet como se vincula en mi respuesta.
doktor5000

Respuestas:

5

un poco tarde para la fiesta, pero espero que alguien encuentre esto útil:

find /usr/ -exec /bin/sh -c "rpm -qf {} &> /dev/null || echo {}" \;

Este comando se arrastra sobre el sistema de archivos y se ejecuta rpm -qfen él. rpm -qfimprime el paquete correspondiente para un archivo y, afortunadamente, tiene un valor de retorno de 0 si encuentra uno y 1 de lo contrario.

Si eres valiente, puedes vincular la salida | xargs rm -f, pero personalmente no sería tan valiente. Resulta que hay muchas cosas en / usr que realmente no son propiedad de nada.

akors
fuente
3

Hasta donde yo sé, esto no es posible con algún tipo de comando dedicado, solo a través de una pequeña secuencia de comandos. TL; DR: vea los enlaces en la parte inferior. Y para sistemas basados ​​en rpm u otros gestores de paquetes basados ​​en binarios, esto no tiene mucho sentido. Dichos administradores de paquetes suelen ser máquinas basadas en el estado destinadas a realizar un seguimiento de las cosas que instalan ellos mismos, y no a saber todo lo que los usuarios se escabullen en el sistema "detrás de la parte posterior" del administrador de paquetes.

¿Dónde trazaría la línea para los archivos que no son propiedad de los archivos rpm? ¿Qué pasa con los archivos temporales (think / tmp y / var / tmp) o cachés (think / var / cache) o archivos creados por un usuario (/ home o / srv u otros puntos de montaje definidos por el usuario)?

Para las distribuciones basadas en la fuente, podría tener sentido ofrecer esa funcionalidad si el caso de uso los limita a directorios FHS utilizados por paquetes "del sistema" como / usr, / bin, / lib y similares, en lugar de, por ejemplo, / usr / local o / optar por software de terceros.


Consulte las siguientes preguntas similares para los scriptlets para hacer lo que solicitó:

doktor5000
fuente
3

Por /superuser/555918/how-do-i-list-all-the-files-not-owned-by-any-package-in-a-rpm-based-system , el siguiente comando es una base sólida para lo que necesita:

comm -13 <(rpm -qla | sort) <(find / -type f | sort)

Personalizar aún más filtrando el comando find a los directorios de interés (ya sea especificando la lista de directorios en lugar de /(por ejemplo /{usr,bin}) o excluir carpetas como /proc, /dev, /home, y /tmp.

determinar
fuente
Más exhaustivamente: comm -13 <(rpm -qla | sort | uniq) <(find / -xdev \( -type f -o -type d -o -type l \) | sort) Esto enumera ( -l) los archivos en todos los paquetes instalados ( rpm -qa) y los ordena, luego elimina los duplicados (porque algunos directorios son suministrados por múltiples paquetes). También encuentra todos los archivos en la partición raíz (sin entrar en otros sistemas de archivos -xdev) y devuelve todos los archivos, directorios y enlaces simbólicos ( \( -type f -o -type d -o -type l \)). Luego se utiliza commpara comparar, ignorando las entradas solo en la lista de rpm ( -1) y las entradas en ambos ( -3).
IBBoard
También tenga en cuenta que es posible que necesite usar sudoen la búsqueda para poder encontrar archivos (especialmente bajo / etc) a los que solo puede acceder la raíz.
IBBoard