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.txthay miles de archivos en una pequeña cantidad de directorios, como /usr/lib64/gcc, /usr/lib64/python2.7y /usr/lib64/python3.2. El /usr/lib64/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.oarchivo, por ejemplo, no está portage.txtporque, en su lugar, lo hay /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o. En mi sistema /usr/libhay un enlace simbólico a /usr/lib64. Parece que necesito manejar adecuadamente los enlaces simbólicos para obtener mejores resultados. Quizás agregando portage.txttodos los archivos a los que apuntan. Realmente no sé cómo hacer eso.
Además, ¿por qué portage.txtes 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 findcomando que también deba excluirse?

Respuestas:
Lo que estás buscando podría ser
qfile. Es parte delapp-portage/portage-utilspaquete y ofrece la opción-oo--orphans. Puedes usar algo comopara obtener una lista de archivos huérfanos en
/usr/bin.Observación: Lamentablemente,
qfileen 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.txtejecutando el siguiente comando:Esto sirve para poner en
portage.txtlos archivos que los enlaces simbólicos apuntan, y no los enlaces simbólicos en sí. Es necesario porque elfindcomando que creaall.txtno 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 ejecutareadlinken 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.txtera más grande queall.txt. Esto se debe principalmente al hecho de que eliminé explícitamente el/usr/srcdirectorio y todos los archivos a continuación de los resultados delfindcomando, pero losequeryenumeré 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.pyco.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 elgrepcomando y la otra para elsedcomando, 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 '*'