Encuentra archivos que no fueron instalados por el administrador de paquetes

8

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?

Francesco Turco
fuente
1
"Esto se debe a que quiero mantener mi sistema lo más limpio posible, eliminando todos los archivos inútiles". - ¿Es tu propio tiempo que ya has gastado en ese espacio en disco más barato que el desperdicio de megabytes? :)
Poige
Bueno, debería haber dicho que también es para encontrar archivos que pertenecen a un paquete que no se ha instalado a través del administrador de paquetes. Necesitaba un programa, pero no había ebuild reciente disponible, y todavía tengo que aprender a escribir ebuilds correctamente.
Francesco Turco
Esto puede ser útil: us.generation-nt.com/answer/…
ed.

Respuestas:

2

Lo que estás buscando podría ser qfile. Es parte del app-portage/portage-utilspaquete y ofrece la opción -oo --orphans. Puedes usar algo como

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

para 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 qfile qfile -o $(find /usr/bin)no funciona si el conjunto de resultados de búsqueda es grande, por lo tanto, debemos evitarlo. poco, usando xargs.

Por cierto, esto no es algo que a mí se me ocurrió, pero lo encontré en gossamer-threads, un comentario de yvasilev .

luttztfz
fuente
Gentoo no usa el administrador de paquetes Debian.
vonbrand
1
Cierto. Gentoo usa portage. Al igual que la pregunta original claramente establecida. ¿Quién quería saber cómo encontrar archivos huérfanos en un sistema Debian?
luttztfz
0

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 .

margarita
fuente
0

Logré solucionar el problema relacionado con los enlaces simbólicos portage.txtejecutando el siguiente comando:

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

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 el findcomando que crea all.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 ejecuta readlinken 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 que all.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 del findcomando, pero los equeryenumeré 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):

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

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 el grepcomando y la otra para el sedcomando, pero tal vez se pueda hacer en un solo paso.

Francesco Turco
fuente
Probablemente sería mucho más rápido, simplemente usando 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 '*'
Evi1M4chine