Risposte:
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..pycfile (librerie Python compilate), .elcfile ( librerie Emacs Lisp compilate), ecc./var/lib/dpkg/info/*.list- la query sopra dovrebbe essere riscritta in base ad altri principi.
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.
locatedatabase sarebbe più veloce dell'esecuzione find? locate \* | grep -v "^/home/"- ha anche il vantaggio di guardare dentro /boot/e altre partizioni di sistema.
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)
find: argument list too long