Encontre arquivos que não foram instalados pelo gerenciador de pacotes

8

Gostaria de obter uma lista de todos os arquivos no meu sistema Gentoo Linux que não foram instalados pelo gerenciador de pacotes (Portage). Isso ocorre porque eu quero manter meu sistema o mais limpo possível, removendo todos os arquivos inúteis por aí.

Deixe-me contar o que tentei até agora. Primeiro, eu giro a lista de todos os arquivos que pertencem a algum pacote rastreado pelo Portage:

equery files "*" | sort | uniq > portage.txt

Em seguida, gero a lista de todos os arquivos no meu sistema, exceto aqueles com os quais não me importo:

find / \( -path /dev -o -path /proc -o -path /sys -o -path /media \
          -o -path /mnt -o -path /usr/portage -o -path /var/db/pkg \
          -o -path /var/www/localhost/htdocs -o -path /lib64/modules \
          -o -path /usr/src -o -path /var/cache -o -path /home \
          -o -path /root -o -path /run -o -path /var/run -o -path /var/tmp \
          -o -path /var/log -o -path /tmp -o -path /etc/config-archive \
          -o -path /usr/local/portage -o -path /boot \) -prune \
          -o -type f | sort | uniq > all.txt

Finalmente, recebo a lista de todos os arquivos que não são rastreados pelo Portage:

comm -13 portage.txt all.txt > extra.txt

Algumas estatísticas:

wc -l portage.txt all.txt extra.txt
  127724 portage.txt
   78371 all.txt
    8438 extra.txt

Como você pode ver, ainda recebo mais de oito mil arquivos extras. Gostaria de reduzir esse número, para focar mais nos arquivos que realmente precisam ser excluídos.

Notei que extra.txtexistem milhares de arquivos em um pequeno número de diretórios, como /usr/lib64/gcc, /usr/lib64/python2.7e /usr/lib64/python3.2. O /usr/lib64/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.oarquivo, por exemplo, não está presente portage.txtporque, em seu lugar, existe /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o. No meu sistema /usr/libé um link simbólico para /usr/lib64. Parece que preciso lidar com links simbólicos para obter melhores resultados. Talvez adicionando em portage.txttodos os arquivos que eles apontam. Eu realmente não sei como fazer isso.

Além disso, por que portage.txté maior que all.txt? Não deveria ser o contrário, já que os arquivos rastreados pelo Portage são um subconjunto de todos os arquivos no meu sistema?

Finalmente, estou esquecendo qualquer outro local no findcomando que também deva ser excluído?

Francesco Turco
fonte
1
"Isso ocorre porque quero manter meu sistema o mais limpo possível, removendo todos os arquivos inúteis por aí". - você já gastou seu tempo com megabytes mais baratos do que desperdiçados em espaço em disco? :)
poige
Bem, eu deveria ter dito que também é para encontrar arquivos que pertencem a um pacote que não foi instalado através do gerenciador de pacotes. Eu precisava de um programa, mas nenhum ebuild recente estava disponível, e ainda tenho que aprender a escrever o ebuilds corretamente.
Francesco Turco
Isso pode ser útil: us.generation-nt.com/answer/…
ed.

Respostas:

2

O que você está procurando pode ser qfile. Faz parte do app-portage/portage-utilspacote e fornece a opção -oou --orphans. Você pode usar algo como

find /usr/bin | xargs -I{} qfile -o {}

para obter uma lista de arquivos órfãos /usr/bin.

Observação: Infelizmente, qfilena versão estável atual do portage-utils, não suporta a leitura de stdin, e a solução mencionada na página de manual do qfile qfile -o $(find /usr/bin)não funciona se o conjunto de resultados da busca for grande, portanto, temos que contorná-lo. um pouco, usando xargs.

BTW, isso não é algo que eu mesmo sugeri , mas achei no gossamer-threads, um comentário de yvasilev .

luttztfz
fonte
O Gentoo não usa o gerenciador de pacotes Debian.
vonbrand
1
Verdade. O Gentoo usa o portage. Como a pergunta original claramente declarada. Quem queria saber como encontrar arquivos órfãos em um sistema Debian?
luttztfz 11/01
0

IIRC, o gentoo armazena as informações do pacote em texto simples (/ var / db / talvez), a pesquisa direta pode ser lenta.

A melhor maneira de fazer isso é criar um banco de dados sqlited (ou qualquer que seja o banco de dados) para todos os arquivos do pacote, listar todos os arquivos no seu sistema, procurá-los no banco de dados um por um, se não encontrado, ele não pertence ao portage .

margarida
fonte
0

Eu consegui corrigir o problema relacionado aos links simbólicos portage.txtexecutando o seguinte comando:

equery files '*' | while read i; do readlink -e "${i}"; done | sort | uniq \
       > portage.txt

Isso serve para colocar nos portage.txtarquivos os links simbólicos apontam para, e não os links simbólicos em si. É necessário porque o findcomando que cria all.txtnão lista nenhum link simbólico, mas apenas os arquivos para os quais eles apontam; portanto, haveria muitos falsos positivos em contrário. É um comando bastante lento, pois roda readlinkem milhares de arquivos, mas não consegui encontrar uma solução melhor. Qualquer sugestão é bem vinda.

Outra coisa que eu entendi (isso foi mais fácil) é por que portage.txtera maior que all.txt. Isso se deve principalmente ao fato de eu ter podado explicitamente o /usr/srcdiretório e todos os arquivos abaixo dos resultados do findcomando, mas os equerylistado independentemente.

A última coisa que fiz, mesmo que isso não estivesse em questão, foi ignorar as coisas do Python (principalmente __pycache__arquivos e arquivos com o sufixo .pycou .pyo):

grep '\(\.cpython-32\)\?\.py[co]$\|/__pycache__' candidates.txt \
     > candidates-bytecode.txt
sed -e 's/\(\.cpython-32\)\?\.py[co]$/.py/' \
    -e 's/\/__pycache__//' \
    candidates-bytecode.txt | sort | uniq \
    > candidates-bytecode-source.txt
comm -23 candidates-bytecode-source.txt portage.txt \
     > orphaned-bytecode.txt

Dessa forma, rastreio a origem de todas as coisas do Python e verifico se está dentro portage.txt. Como você pode ver, escrevi a mesma expressão regular duas vezes, uma para o grepcomando e a outra para o sedcomando, mas talvez isso possa ser feito em apenas uma única etapa.

Francesco Turco
fonte
Provavelmente seria um muito mais rápido, simplesmente usando cat /var/db/pkg/*/*/CONTENTS | sed -r 's/^... //; s/ ([0-9a-f]+ )[0-9]+$//; s/ -> .*$//'diretamente, em vez do incrivelmente lento Pythonequery files '*'
Evi1M4chine