Encontre arquivos não instalados pelo gerenciador de pacotes RPM

9

Existe alguma maneira de descobrir todos os arquivos em um determinado sistema que não foram instalados via RPM? Eu entendo que eu posso fazer isso com força bruta usando algo como rpmquery -fem um script que percorre todos os arquivos no sistema de arquivos, no entanto, eu queria saber se existe alguma maneira padrão de fazer isso para sistemas baseados em RPM (especificamente o Fedora, que eu uso no casa). Já que isso é para o Fedora, é bom usar yumou dnfdescobrir isso.

Se não houver uma maneira padrão de fazer isso, alguém sabe de alguns scripts pré-existentes para fazer isso? Não quero reinventar a roda se não precisar.

PS Há outra pergunta semelhante a essa , mas é sobre o Gentoo e o Portage, portanto não é totalmente relevante.

eestrada
fonte
Por curiosidade, qual seria o caso de uso real?
Doktor5000 16/02
1
@ doktor5000 Tenho um desktop doméstico ao qual adicionei uma boa quantidade de software de terceiros nos últimos anos. Em vez de tentar rastrear manualmente todos os arquivos que eu instalei fora do rpm, seria bom obter uma lista desses arquivos para saber o que copiar manualmente, reinstalar quando atualizar o sistema ou simplesmente ignorar. Tenho azar ao tentar atualizações no Fedora, por isso tendem a reinstalar totalmente novas.
eestrada
Bem, então talvez seja mais fácil primeiro limitar-se a pacotes rpm que não vêm com os repositórios base. Além disso, outro software é normalmente instalado em / usr / local por padrão ou em / opt, o que deve ser bastante fácil de verificar, pois isso não é usado pelos pacotes de distribuição normais. Para caminhos padrão como / usr / bin, / usr / share ou / usr / lib e similares, você provavelmente precisará recorrer a um dos métodos de scriptlet, conforme vinculado na minha resposta.
Doktor5000

Respostas:

5

um pouco atrasado para a festa, mas espero que alguém ache isso útil:

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

Este comando rastreia o sistema de arquivos e é executado rpm -qfnele. rpm -qfimprime o pacote correspondente para um arquivo e, felizmente, tem um valor de retorno 0 se encontrar um e 1 caso contrário.

Se você é corajoso, pode vincular a saída | xargs rm -f, mas pessoalmente eu não seria tão corajoso. Acontece que há muitas coisas em / usr que realmente não são de propriedade de nada.

akors
fonte
3

Tanto quanto sei, isso não é possível com algum tipo de comando dedicado, apenas através de um pouco de script. TL; DR - veja os links na parte inferior. E para sistemas baseados em rpm ou outros gerenciadores de pacotes binários, isso não faz muito sentido. Esses gerenciadores de pacotes geralmente são máquinas baseadas no estado, destinadas a acompanhar o que eles instalam e a não saber tudo o que os usuários furtam no sistema "atrás das costas" do gerenciador de pacotes.

Onde você desenharia a linha para arquivos que não pertencem a arquivos rpm? E os arquivos temporários (think / tmp e / var / tmp) ou caches (think / var / cache) ou arquivos criados por um usuário (/ home ou / srv ou outros pontos de montagem definidos pelo usuário).

Para distribuições baseadas na fonte, pode fazer sentido oferecer essa funcionalidade se o caso de uso as limitar aos diretórios do FHS usados ​​pelos pacotes "system" como / usr, / bin, / lib e similares, em oposição a / usr / local ou / optar por software de terceiros.


Consulte as seguintes perguntas semelhantes sobre os scriptlets para fazer o que você pediu:

doktor5000
fonte
3

Por /superuser/555918/how-do-i-list-all-the-files-not-owned-by-any-package-in-a-rpm-based-system , o seguinte comando é uma linha de base sólida para o que você precisa:

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

Personalizar ainda mais, filtrando o comando Localizar para diretórios de interesse (ou especificar a lista de diretórios em vez de /(por exemplo /{usr,bin}) ou excluindo pastas como /proc, /dev, /home, e /tmp.

deter
fonte
Mais exaustivamente: comm -13 <(rpm -qla | sort | uniq) <(find / -xdev \( -type f -o -type d -o -type l \) | sort) Isso lista ( -l) os arquivos em todos os pacotes instalados ( rpm -qa) e os classifica e remove duplicatas (porque alguns diretórios são fornecidos por vários pacotes). Ele também encontra todos os arquivos na partição raiz (sem entrar em outros sistemas de arquivos - -xdev) e retorna todos os arquivos, diretórios e links simbólicos ( \( -type f -o -type d -o -type l \)). Em seguida, ele é usado commpara comparar, ignorando as entradas apenas na lista de rpm ( -1) e as entradas em ambas ( -3).
IBBoard 8/03/19
Observe também que você pode precisar usar sudoo find para encontrar arquivos (especialmente em / etc) que somente o root pode acessar.
IBBoard 8/03/19