Suchen Sie nach Dateien, die nicht vom Paketmanager installiert wurden

8

Ich möchte eine Liste aller Dateien in meinem Gentoo Linux-System erhalten, die nicht vom Paketmanager (Portage) installiert wurden. Dies liegt daran, dass ich mein System so sauber wie möglich halten und alle nutzlosen Dateien entfernen möchte, die herumliegen.

Lassen Sie mich Ihnen sagen, was ich bis jetzt versucht habe. Zunächst generiere ich die Liste aller Dateien, die zu einem von Portage verfolgten Paket gehören:

equery files "*" | sort | uniq > portage.txt

Dann generiere ich die Liste aller Dateien auf meinem System, mit Ausnahme derjenigen, die mir egal sind:

find / \( -path /dev -o -path /proc -o -path /sys -o -path /media \
          -o -path /mnt -o -path /usr/portage -o -path /var/db/pkg \
          -o -path /var/www/localhost/htdocs -o -path /lib64/modules \
          -o -path /usr/src -o -path /var/cache -o -path /home \
          -o -path /root -o -path /run -o -path /var/run -o -path /var/tmp \
          -o -path /var/log -o -path /tmp -o -path /etc/config-archive \
          -o -path /usr/local/portage -o -path /boot \) -prune \
          -o -type f | sort | uniq > all.txt

Schließlich erhalte ich die Liste aller Dateien, die nicht von Portage verfolgt werden:

comm -13 portage.txt all.txt > extra.txt

Einige Statistiken:

wc -l portage.txt all.txt extra.txt
  127724 portage.txt
   78371 all.txt
    8438 extra.txt

Wie Sie sehen, erhalte ich immer noch mehr als achttausend zusätzliche Dateien. Ich möchte diese Anzahl reduzieren, um mich mehr auf Dateien zu konzentrieren, die wirklich gelöscht werden müssen.

Ich bemerkte , dass in extra.txtes gibt Tausende von Dateien in einer kleinen Anzahl von Verzeichnissen, wie /usr/lib64/gcc, /usr/lib64/python2.7und /usr/lib64/python3.2. Die /usr/lib64/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.oDatei befindet sich beispielsweise nicht in, portage.txtweil an ihrer Stelle vorhanden ist /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o. Auf meinem System /usr/libbefindet sich ein Symlink zu /usr/lib64. Es scheint also, dass ich mit Symlinks richtig umgehen muss, um bessere Ergebnisse zu erzielen. Vielleicht durch Hinzufügen portage.txtaller Dateien, auf die sie verweisen. Ich weiß nicht wirklich, wie ich das machen soll.

Auch warum portage.txtist größer als all.txt? Sollte nicht das Gegenteil sein, da von Portage verfolgte Dateien eine Teilmenge aller Dateien in meinem System sind?

Vergesse ich schließlich eine andere Stelle im findBefehl, die ebenfalls ausgeschlossen werden sollte?

Francesco Turco
quelle
1
"Das liegt daran, dass ich mein System so sauber wie möglich halten und alle nutzlosen Dateien entfernen möchte, die herumliegen." - Ist Ihre eigene Zeit, die Sie bereits dafür aufgewendet haben, billiger als verschwendete Megabyte Festplattenspeicher? :)
Poige
Nun, ich hätte sagen sollen, dass es auch dazu dient, Dateien zu finden, die zu einem Paket gehören, das nicht über den Paketmanager installiert wurde. Ich brauchte ein Programm, aber es war kein neues Ebuild verfügbar, und ich muss noch lernen, wie man Ebuilds richtig schreibt.
Francesco Turco
Dies könnte hilfreich sein: us.generation-nt.com/answer/…
ed.

Antworten:

2

Was Sie suchen, könnte sein qfile. Es ist Teil des app-portage/portage-utilsPakets und bietet Option -ooder --orphans. Sie können so etwas wie verwenden

find /usr/bin | xargs -I{} qfile -o {}

um eine Liste verwaister Dateien in zu erhalten /usr/bin.

Anmerkung: Leider unterstützt qfilein der aktuellen stabilen Version von portage-utils das Lesen von stdin nicht, und die in der Manpage von qfile erwähnte Lösung qfile -o $(find /usr/bin)funktioniert nicht, wenn die Suchergebnismenge groß ist. Daher müssen wir sie umgehen. A. ein bisschen mit xargs.

Übrigens, das habe ich mir nicht ausgedacht , aber ich habe es bei Gossamer-Threads gefunden, einem Kommentar von yvasilev .

luttztfz
quelle
Gentoo verwendet den Debian-Paketmanager nicht.
vonbrand
1
Wahr. Gentoo verwendet Portage. Wie die ursprüngliche Frage klar angegeben. Wer wollte wissen, wie man verwaiste Dateien auf einem Debian-System findet?
luttztfz
0

IIRC, Gentoo speichert Paketinformationen im Klartext (/ var / db / vielleicht), die direkte Suche kann langsam sein.

Der beste Weg, dies zu tun, besteht darin, eine sqlitedatabase (oder eine beliebige Datenbank) für alle Paketdateien zu erstellen, dann alle Dateien auf Ihrem System aufzulisten und sie einzeln in der Datenbank nachzuschlagen. Wenn sie nicht gefunden werden, gehört sie nicht zur Portage .

Gänseblümchen
quelle
0

Ich habe es geschafft, das Problem im Zusammenhang mit Symlinks zu beheben, portage.txtindem ich den folgenden Befehl ausgeführt habe:

equery files '*' | while read i; do readlink -e "${i}"; done | sort | uniq \
       > portage.txt

Dies dient dazu, in portage.txtdie Dateien Symlinks zu verweisen und nicht selbst Symlinks. Dies ist erforderlich, da der erstellte findBefehl all.txtkeinen Symlink auflistet, sondern nur die Dateien, auf die sie verweisen. Andernfalls würde es viele Fehlalarme geben. Es ist ein ziemlich langsamer Befehl, da er readlinkauf Tausenden von Dateien ausgeführt wird, aber ich konnte keine bessere Lösung finden. Jeder Vorschlag ist willkommen.

Eine andere Sache, die ich verstanden habe (das war einfacher), ist, warum portage.txtgrößer als war all.txt. Dies liegt hauptsächlich an der Tatsache, dass ich das /usr/srcVerzeichnis und alle darunter liegenden Dateien explizit aus den Ergebnissen des findBefehls entfernt habe, sie aber trotzdem equeryaufgelistet habe.

Das Letzte, was ich getan habe, war Python-Zeug zu ignorieren (meistens __pycache__Dateien und Dateien mit dem Suffix .pycoder .pyo) , auch wenn dies nicht in Frage kam :

grep '\(\.cpython-32\)\?\.py[co]$\|/__pycache__' candidates.txt \
     > candidates-bytecode.txt
sed -e 's/\(\.cpython-32\)\?\.py[co]$/.py/' \
    -e 's/\/__pycache__//' \
    candidates-bytecode.txt | sort | uniq \
    > candidates-bytecode-source.txt
comm -23 candidates-bytecode-source.txt portage.txt \
     > orphaned-bytecode.txt

Auf diese Weise verfolge ich den Ursprung aller Python-Inhalte und überprüfe, ob sie vorhanden sind portage.txt. Wie Sie sehen, habe ich denselben regulären Ausdruck zweimal geschrieben, einen für den grepBefehl und einen für den sedBefehl, aber vielleicht kann dies in nur einem Schritt erfolgen.

Francesco Turco
quelle
Es wäre wahrscheinlich viel schneller, wenn Sie es einfach cat /var/db/pkg/*/*/CONTENTS | sed -r 's/^... //; s/ ([0-9a-f]+ )[0-9]+$//; s/ -> .*$//'direkt verwenden würden, anstatt des erstaunlich langsamen Pythonequery files '*'
Evi1M4chine