¿Cómo encontrar archivos que no son propiedad de ningún paquete?

12

En mi sistema tengo archivos que no pertenecen a ningún paquete, son míos o de programas compilados instalados make install. ¿Cómo puedo encontrar todos los archivos que no pertenecen a ningún paquete?

geaplanet
fuente

Respuestas:

10

En /var/lib/dpkg/infoson .listarchivos de texto que lista todos los archivos contenidos en cada package¹ instalado a través del gestor de paquetes de Debian.

Encontrar todos los archivos en el sistema de archivos que no coincidan con ninguna entrada se puede lograr con algo ingenuo como este:

find / -xdev -type f \( -exec grep -xq "{}" /var/lib/dpkg/info/*.list \; -or -print \)

Obviamente, esto llevará mucho tiempo ya que se escaneará todo el sistema de archivos. Si utiliza diferentes particiones para los directorios del sistema (como /usro /var), especifíquelas después de la inicial /.

Advertencia: Eso no incluye archivos creados por scripts de paquetes. Por ejemplo:

  • /etc/hosts.allowno aparece en ninguna parte, pero podría provenir de lo libwrap0que posiblemente lo creó, si ese archivo no existía en el momento de la instalación del paquete.
  • Muchos archivos se compilan durante la instalación, por ejemplo, .pycarchivos (bibliotecas compiladas de Python), .elcarchivos ( bibliotecas compiladas de Emacs Lisp), etc.
  • ...
Patrice Levesque
fuente
errorfind: argument list too long
naught101
@ naught101 Eso sugiere que hay una gran cantidad de archivos que coinciden /var/lib/dpkg/info/*.list: la consulta anterior debería reescribirse bajo algún otro principio.
Patrice Levesque
6

Una versión más eficiente de la solución de @ Patrice , utilizando un shell con soporte para la sustitución de procesos ( bash, AT&T ksh, zsh):

(
  export LC_ALL=C
  comm -23 <(find / -xdev -type f | sort) \
           <(sort -u /var/lib/dpkg/info/*.list)
)

Al igual que la solución de Patrice, supone que ninguna ruta de archivo contiene caracteres de nueva línea.

Stéphane Chazelas
fuente
1
¿Usar la locatebase de datos sería más rápido que ejecutarlo find? locate \* | grep -v "^/home/"- también tiene la ventaja de buscar /boot/y otras particiones del sistema.
naught101
3

Dado que etiquetó, su pregunta con debianla opción obvia que no se ha mencionado aún es usarla cruft-ngsi no requiere flexibilidad o cruftsi no desea buscar en todo el sistema / ubicaciónb.

stefanct
fuente
0

También puede usar la sustitución de procesos & grep& find. Tenga en cuenta que grepse usa dos veces para filtrar solo las rutas relevantes /var/lib/dpkg/infopara ahorrar unos segundos si está buscando archivos en un determinado directorio.

dir="/lib/x86_64-linux-gnu"
find "$dir" -type f \
| grep -v -x -F -f \
    <(find '/var/lib/dpkg/info' -name '*.list' -print0 \
       | xargs -0 grep -h -F "^$dir" \
       | sort -u)
Josef Kufner
fuente