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.txt
existem 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 /usr/lib64/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o
arquivo, por exemplo, não está presente portage.txt
porque, 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.txt
todos 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 find
comando que também deva ser excluído?
Respostas:
O que você está procurando pode ser
qfile
. Faz parte doapp-portage/portage-utils
pacote e fornece a opção-o
ou--orphans
. Você pode usar algo comopara obter uma lista de arquivos órfãos
/usr/bin
.Observação: Infelizmente,
qfile
na 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 qfileqfile -o $(find /usr/bin)
não funciona se o conjunto de resultados da busca for grande, portanto, temos que contorná-lo. um pouco, usandoxargs
.BTW, isso não é algo que eu mesmo sugeri , mas achei no gossamer-threads, um comentário de yvasilev .
fonte
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 .
fonte
Eu consegui corrigir o problema relacionado aos links simbólicos
portage.txt
executando o seguinte comando:Isso serve para colocar nos
portage.txt
arquivos os links simbólicos apontam para, e não os links simbólicos em si. É necessário porque ofind
comando que criaall.txt
nã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 rodareadlink
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) é por que
portage.txt
era maior queall.txt
. Isso se deve principalmente ao fato de eu ter podado explicitamente o/usr/src
diretório e todos os arquivos abaixo dos resultados dofind
comando, mas osequery
listado 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.pyc
ou.pyo
):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 ogrep
comando e a outra para osed
comando, mas talvez isso possa ser feito em apenas uma única etapa.fonte
cat /var/db/pkg/*/*/CONTENTS | sed -r 's/^... //; s/ ([0-9a-f]+ )[0-9]+$//; s/ -> .*$//'
diretamente, em vez do incrivelmente lento Pythonequery files '*'