Me gustaría obtener una lista de todos los archivos en mi sistema Gentoo Linux que no fueron instalados por el administrador de paquetes (Portage). Esto se debe a que quiero mantener mi sistema lo más limpio posible, eliminando todos los archivos inútiles que están por ahí.
Déjame decirte lo que he intentado hasta ahora. En primer lugar, genero la lista de todos los archivos que pertenecen a algún paquete rastreado por Portage:
equery files "*" | sort | uniq > portage.txt
Luego genero la lista de todos los archivos en mi sistema, excepto aquellos que no me importan:
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, obtengo la lista de todos los archivos que Portage no rastrea:
comm -13 portage.txt all.txt > extra.txt
Algunas estadísticas:
wc -l portage.txt all.txt extra.txt
127724 portage.txt
78371 all.txt
8438 extra.txt
Como puede ver, todavía recibo más de ocho mil archivos adicionales. Me gustaría reducir ese número, para centrarme más en los archivos que realmente necesitan ser eliminados.
Me di cuenta de que extra.txt
hay miles de archivos en una pequeña cantidad de directorios, como /usr/lib64/gcc
, /usr/lib64/python2.7
y /usr/lib64/python3.2
. El /usr/lib64/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o
archivo, por ejemplo, no está portage.txt
porque, en su lugar, lo hay /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o
. En mi sistema /usr/lib
hay un enlace simbólico a /usr/lib64
. Parece que necesito manejar adecuadamente los enlaces simbólicos para obtener mejores resultados. Quizás agregando portage.txt
todos los archivos a los que apuntan. Realmente no sé cómo hacer eso.
Además, ¿por qué portage.txt
es más grande que all.txt
? ¿No debería ser lo contrario ya que los archivos rastreados por Portage son un subconjunto de todos los archivos en mi sistema?
Finalmente, ¿estoy olvidando alguna otra ubicación en el find
comando que también deba excluirse?
Respuestas:
Lo que estás buscando podría ser
qfile
. Es parte delapp-portage/portage-utils
paquete y ofrece la opción-o
o--orphans
. Puedes usar algo comopara obtener una lista de archivos huérfanos en
/usr/bin
.Observación: Lamentablemente,
qfile
en la versión estable actual de portage-utils, no es compatible con readin desde stdin, y la solución mencionada en la página de manual de qfileqfile -o $(find /usr/bin)
no funciona si el conjunto de resultados de búsqueda es grande, por lo tanto, debemos evitarlo. poco, usandoxargs
.Por cierto, esto no es algo que a mí se me ocurrió, pero lo encontré en gossamer-threads, un comentario de yvasilev .
fuente
IIRC, gentoo almacena la información del paquete en texto plano (/ var / db / quizás), la búsqueda directa puede ser lenta.
La mejor manera de hacerlo es crear una base de datos sqlite (o lo que sea db) para todos los archivos de paquete, luego enumerar todos los archivos en su sistema, buscarlos en el db uno por uno, si no se encuentra, no pertenece a portage .
fuente
Logré solucionar el problema relacionado con los enlaces simbólicos
portage.txt
ejecutando el siguiente comando:Esto sirve para poner en
portage.txt
los archivos que los enlaces simbólicos apuntan, y no los enlaces simbólicos en sí. Es necesario porque elfind
comando que creaall.txt
no enumera ningún enlace simbólico, sino solo los archivos a los que apunta, por lo que de lo contrario habría muchos falsos positivos. Es un comando bastante lento, ya que se ejecutareadlink
en miles de archivos, pero no pude encontrar una mejor solución. Cualquier sugerencia es bienvenida.Otra cosa que entendí (esto fue más fácil) es por qué
portage.txt
era más grande queall.txt
. Esto se debe principalmente al hecho de que eliminé explícitamente el/usr/src
directorio y todos los archivos a continuación de los resultados delfind
comando, pero losequery
enumeré de todos modos.Lo último que hice, incluso si esto no estaba en la pregunta, fue ignorar las cosas de Python (principalmente
__pycache__
archivos y archivos con el sufijo.pyc
o.pyo
):De esta manera, rastreé el origen de todas las cosas de Python y verifiqué si está dentro
portage.txt
. Como puede ver, escribí la misma expresión regular dos veces, una para elgrep
comando y la otra para elsed
comando, pero tal vez se pueda hacer en un solo paso.fuente
cat /var/db/pkg/*/*/CONTENTS | sed -r 's/^... //; s/ ([0-9a-f]+ )[0-9]+$//; s/ -> .*$//'
directamente, en lugar de la increíblemente lenta Pythonequery files '*'