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.txt
es gibt Tausende von Dateien in einer kleinen Anzahl von Verzeichnissen, wie /usr/lib64/gcc
, /usr/lib64/python2.7
und /usr/lib64/python3.2
. Die /usr/lib64/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o
Datei befindet sich beispielsweise nicht in, portage.txt
weil an ihrer Stelle vorhanden ist /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o
. Auf meinem System /usr/lib
befindet 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.txt
aller Dateien, auf die sie verweisen. Ich weiß nicht wirklich, wie ich das machen soll.
Auch warum portage.txt
ist 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 find
Befehl, die ebenfalls ausgeschlossen werden sollte?
Antworten:
Was Sie suchen, könnte sein
qfile
. Es ist Teil desapp-portage/portage-utils
Pakets und bietet Option-o
oder--orphans
. Sie können so etwas wie verwendenum eine Liste verwaister Dateien in zu erhalten
/usr/bin
.Anmerkung: Leider unterstützt
qfile
in der aktuellen stabilen Version von portage-utils das Lesen von stdin nicht, und die in der Manpage von qfile erwähnte Lösungqfile -o $(find /usr/bin)
funktioniert nicht, wenn die Suchergebnismenge groß ist. Daher müssen wir sie umgehen. A. ein bisschen mitxargs
.Übrigens, das habe ich mir nicht ausgedacht , aber ich habe es bei Gossamer-Threads gefunden, einem Kommentar von yvasilev .
quelle
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 .
quelle
Ich habe es geschafft, das Problem im Zusammenhang mit Symlinks zu beheben,
portage.txt
indem ich den folgenden Befehl ausgeführt habe:Dies dient dazu, in
portage.txt
die Dateien Symlinks zu verweisen und nicht selbst Symlinks. Dies ist erforderlich, da der erstelltefind
Befehlall.txt
keinen Symlink auflistet, sondern nur die Dateien, auf die sie verweisen. Andernfalls würde es viele Fehlalarme geben. Es ist ein ziemlich langsamer Befehl, da erreadlink
auf 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.txt
größer als warall.txt
. Dies liegt hauptsächlich an der Tatsache, dass ich das/usr/src
Verzeichnis und alle darunter liegenden Dateien explizit aus den Ergebnissen desfind
Befehls entfernt habe, sie aber trotzdemequery
aufgelistet habe.Das Letzte, was ich getan habe, war Python-Zeug zu ignorieren (meistens
__pycache__
Dateien und Dateien mit dem Suffix.pyc
oder.pyo
) , auch wenn dies nicht in Frage kam :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 dengrep
Befehl und einen für densed
Befehl, aber vielleicht kann dies in nur einem Schritt erfolgen.quelle
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 '*'