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

8

Eu 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 porque quero manter meu sistema o mais limpo possível, removendo todos os arquivos inúteis que estão por aí.

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

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

Em seguida, gerei a lista de todos os arquivos no meu sistema, exceto aqueles que não me interessam:

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

Por fim, 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. Eu gostaria de reduzir esse número, para me concentrar mais em arquivos que realmente precisam ser excluídos.

Percebi que em extra.txt há milhares de arquivos em um pequeno número de diretórios, como /usr/lib64/gcc , /usr/lib64/python2.7 e /usr/lib64/python3.2 . O arquivo /usr/lib64/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o , por exemplo, não está em portage.txt porque, em seu lugar, há /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 . Então, parece que preciso manipular corretamente links simbólicos para obter melhores resultados. Talvez adicionando portage.txt todos os arquivos para os quais eles apontam. Eu realmente não sei como fazer isso.

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

Por fim, estou esquecendo qualquer outro local no comando find que também deva ser excluído?

    
por Francesco Turco 14.10.2012 / 15:47

3 respostas

0

Consegui corrigir o problema relacionado a links simbólicos em portage.txt executando o seguinte comando:

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

Isso serve para colocar em portage.txt os arquivos que os links simbólicos apontam, e não os próprios links simbólicos. Isso é necessário porque o comando find que cria all.txt não lista nenhum link simbólico, mas apenas os arquivos para os quais eles apontam, portanto, haveria muitos falsos positivos. É um comando muito lento, pois ele executa readlink em 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) é porque portage.txt era maior que all.txt . Isso se deve principalmente ao fato de eu explicitamente ter podado o diretório /usr/src e todos os arquivos abaixo dos resultados do comando find , mas equery os listou independentemente.

A última coisa que fiz, mesmo que não estivesse na questão, foi ignorar coisas do Python (principalmente __pycache__ files e arquivos com o sufixo .pyc ou .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

Desta forma eu rastrear a origem de todas as coisas do Python e verificar se está em portage.txt . Como você pode ver, escrevi a mesma expressão regular duas vezes, uma para o comando grep e a outra para o comando sed , mas talvez isso possa ser feito em apenas uma única etapa.

    
por 27.10.2012 / 14:50
1

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

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

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

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

BTW, isso não é algo que eu mesmo criei, mas achei isso em gossamer- tópicos, um comentário por yvasilev .

    
por 09.01.2016 / 23:09
0

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

A melhor maneira de fazer isso é criar um sqlitedatabase (ou qualquer db) para todos os arquivos de pacotes, listar todos os arquivos em seu sistema, procurá-los no banco de dados um por um, se não encontrados, não pertencem ao portage.

    
por 18.10.2012 / 09:04