Comment trouver des fichiers qui n'appartiennent à aucun package?

12

Dans mon système, j'ai des fichiers qui n'appartiennent à aucun paquet, ils sont à moi ou à partir de programmes compilés installés avec make install. Comment puis-je trouver tous les fichiers qui n'appartiennent à aucun package?

geaplanet
la source

Réponses:

10

Dans /var/lib/dpkg/infosont des .listfichiers texte qui liste tous les fichiers contenus dans chaque package¹ installé par le gestionnaire de paquets de Debian.

Trouver tous les fichiers dans le système de fichiers ne correspondant à aucune entrée peut être réalisé avec quelque chose de naïf comme ceci:

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

Cela prendra évidemment beaucoup de temps car tout le système de fichiers sera analysé. Si vous utilisez différentes partitions pour les répertoires système (tels que /usrou /var), spécifiez-les après l'initiale /.

Avertissement: cela n'inclut pas les fichiers créés par les scripts de package. Par exemple:

  • /etc/hosts.allown'est répertorié nulle part mais il peut provenir de libwrap0celui qui l'a éventuellement créé, si ce fichier n'existait pas au moment de l'installation du package.
  • De nombreux fichiers sont compilés lors de l'installation, par exemple des .pycfichiers (bibliothèques Python compilées), des .elcfichiers (librarires Emacs Lisp compilés), etc.
Patrice Levesque
la source
erreurfind: argument list too long
naught101
@ naught101 Cela suggère qu'il y a une correspondance de fichiers de gazillions /var/lib/dpkg/info/*.list- la requête ci-dessus devrait être réécrite selon un autre principe.
Patrice Levesque
6

Une version plus efficace de la solution de @ Patrice , utilisant un shell prenant en charge la substitution de processus ( bash, AT&T ksh, zsh):

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

Comme la solution de Patrice, elle suppose qu'aucun chemin de fichier ne contient de caractères de nouvelle ligne.

Stéphane Chazelas
la source
1
L'utilisation de la locatebase de données serait-elle plus rapide que l'exécution find? locate \* | grep -v "^/home/"- a également l'avantage de rechercher dans /boot/et d'autres partitions du système.
naught101
3

Puisque vous avez marqué votre question, debianle choix évident non mentionné est à utiliser cruft-ngsi vous n'avez besoin d'aucune flexibilité ou cruftsi vous ne souhaitez pas parcourir l'ensemble du système / locatedb.

stefanct
la source
0

Vous pouvez également utiliser la substitution de processus & grep& find. Notez que le grepest utilisé deux fois pour filtrer uniquement les chemins pertinents de /var/lib/dpkg/infopour enregistrer quelques secondes si vous recherchez des fichiers dans un certain répertoire.

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
la source