Come trovare file che non appartengono a nessun pacchetto?


12

Nel mio sistema ho file che non appartengono a nessun pacchetto, sono miei o di programmi compilati installati con make install. Come posso trovare tutti i file che non appartengono ad alcun pacchetto?

Risposte:


10

In /var/lib/dpkg/infosono .listfile di testo che elencano tutti i file contenuti in ciascun pacchetto¹ installati tramite il gestore pacchetti Debian.

Trovare tutti i file nel filesystem che non corrispondono a nessuna voce può essere ottenuto con qualcosa di ingenuo come questo:

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

Ciò richiederà ovviamente molto tempo poiché verrà esaminato l'intero filesystem. Se si utilizzano partizioni diverse per le directory di sistema (come /usro /var), specificarle dopo l'iniziale /.

Avvertenza: ciò non include i file creati dagli script dei pacchetti. Per esempio:

  • /etc/hosts.allownon è elencato da nessuna parte, ma potrebbe derivarne da libwrap0quello eventualmente creato, se quel file non esistesse al momento dell'installazione del pacchetto.
  • Durante l'installazione vengono compilati molti file, ad esempio .pycfile (librerie Python compilate), .elcfile ( librerie Emacs Lisp compilate), ecc.
  • ...

errorefind: argument list too long
nought101

@ naught101 Ciò suggerisce che ci sia una corrispondenza di file gazillion /var/lib/dpkg/info/*.list- la query sopra dovrebbe essere riscritta in base ad altri principi.
Patrice Levesque,

6

Una versione più efficiente della soluzione di @ Patrice , utilizzando una shell con supporto per la sostituzione dei processi ( bash, AT&T ksh, zsh):

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

Come la soluzione di Patrice, presuppone che nessun percorso di file contenga caratteri di nuova riga.


1
L'uso del locatedatabase sarebbe più veloce dell'esecuzione find? locate \* | grep -v "^/home/"- ha anche il vantaggio di guardare dentro /boot/e altre partizioni di sistema.
naught101

2

Dal momento che hai taggato la tua domanda con debianla scelta ovvia non ancora menzionata è quella di utilizzare cruft-ngse non hai bisogno di flessibilità o cruftse non vuoi cercare attraverso l'intero sistema / locationb.


0

Puoi anche usare la sostituzione di processo & grep& find. Si noti che grepviene utilizzato due volte per filtrare solo i percorsi rilevanti da cui /var/lib/dpkg/infosalvare alcuni secondi se si cercano file in una determinata directory.

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.