Wie finde ich Dateien, die keinem Paket gehören?

12

In meinem System habe ich Dateien, die zu keinem Paket gehören, sie gehören mir oder stammen aus kompilierten Programmen, mit denen installiert wurde make install. Wie finde ich alle Dateien, die zu keinem Paket gehören?

Geaplanet
quelle

Antworten:

10

In /var/lib/dpkg/infobefinden sich .listTextdateien, in denen alle Dateien aufgelistet sind, die in jedem Paket enthalten sind¹, das über den Paketmanager von Debian installiert wurde.

Wenn Sie feststellen, dass alle Dateien im Dateisystem mit keinem Eintrag übereinstimmen, können Sie Folgendes erreichen:

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

Dies wird natürlich sehr lange dauern, da das gesamte Dateisystem gescannt wird. Wenn Sie unterschiedliche Partitionen für Systemverzeichnisse verwenden (z. B. /usroder /var), geben Sie diese nach der Initiale an /.

Warnung: Dies schließt keine Dateien ein, die von Paketskripten erstellt wurden. Zum Beispiel:

  • /etc/hosts.allowwird nirgendwo aufgelistet, aber es könnte von dem stammen libwrap0, der es möglicherweise erstellt hat, wenn diese Datei zum Zeitpunkt der Paketinstallation nicht vorhanden war.
  • Viele Dateien werden während der Installation kompiliert, z. B. .pycDateien (kompilierte Python-Bibliotheken), .elcDateien (kompilierte Emacs Lisp-Bibliotheken) usw.
Patrice Levesque
quelle
Fehlerfind: argument list too long
naught101
@ naught101 Das deutet darauf hin, dass eine Unmenge von Dateien übereinstimmt /var/lib/dpkg/info/*.list- die obige Abfrage müsste nach einem anderen Prinzip neu geschrieben werden.
Patrice Levesque
5

Eine effizientere Version der @ Patrice-Lösung , die eine Shell mit Unterstützung für die Prozessersetzung verwendet ( bash, AT & T ksh, zsh):

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

Wie bei Patrices Lösung wird davon ausgegangen, dass kein Dateipfad Zeilenumbruchzeichen enthält.

Stéphane Chazelas
quelle
1
Wäre die Nutzung der locateDatenbank schneller als die Ausführung find? locate \* | grep -v "^/home/"- hat auch den Vorteil, in /boot/und andere Systempartitionen zu schauen .
naught101
2

Da Sie Ihre Frage mit debiander offensichtlichen Wahl markiert haben, die noch nicht erwähnt wurde, sollten Sie sie verwenden, cruft-ngwenn Sie keine Flexibilität benötigen oder cruftwenn Sie nicht das gesamte System / locatedb durchsuchen möchten.

stefanct
quelle
0

Sie können auch die Prozessersetzung & grep& verwenden find. Beachten Sie, dass das grepzweimal verwendet wird, um nur relevante Pfade zu filtern /var/lib/dpkg/info, um einige Sekunden zu sparen, wenn Sie nach Dateien in einem bestimmten Verzeichnis suchen.

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
quelle