Suchen Sie nach Dateien, die nicht vom RPM-Paketmanager installiert wurden

9

Gibt es eine Möglichkeit, alle Dateien auf einem bestimmten System herauszufinden , die nicht über RPM installiert wurden? Ich verstehe, dass ich dies selbst brutal erzwingen kann, indem ich so etwas wie rpmquery -fein Skript verwende, das alle Dateien im Dateisystem durchläuft. Ich habe mich jedoch gefragt, ob es eine Standardmethode für RPM-basierte Systeme gibt (insbesondere Fedora, die ich bei verwende Zuhause). Da dies für Fedora ist, ist es in Ordnung, dies zu verwenden yumoder dnfherauszufinden.

Wenn es keine Standardmethode gibt, kennt jemand einige bereits vorhandene Skripte, um dies zu tun? Ich möchte das Rad nicht neu erfinden, wenn ich es nicht muss.

PS Es gibt eine ähnliche Frage , aber es geht um Gentoo und Portage, daher ist sie nicht ganz relevant.

Eestrada
quelle
Was wäre aus Neugier der eigentliche Anwendungsfall?
Doktor5000
1
@ doktor5000 Ich habe einen Heim-Desktop, dem ich in den letzten Jahren eine ganze Menge Software von Drittanbietern hinzugefügt habe. Anstatt zu versuchen, jede einzelne Datei, die ich außerhalb von RPM installiert habe, von Hand aufzuspüren, wäre es schön, eine Liste dieser Dateien zu erhalten, damit ich weiß, was manuell kopiert, neu installiert werden muss, wenn ich mein System aktualisiere, oder einfach ignoriert. Ich habe Pech, wenn ich bei Fedora Upgrades versuche, daher neige ich dazu, völlig neu zu installieren.
Eestrada
Dann wäre es vielleicht einfacher, sich zunächst auf RPM-Pakete zu beschränken, die nicht mit den Basis-Repositorys geliefert werden. Außerdem wird normalerweise andere Software standardmäßig in / usr / local oder in / opt installiert, was ziemlich einfach zu überprüfen sein sollte, da dies von normalen Distributionspaketen nicht verwendet wird. Für Standardpfade wie / usr / bin, / usr / share oder / usr / lib und ähnliches müssten Sie wahrscheinlich auf eine der in meiner Antwort verlinkten Scriptlet-Methoden zurückgreifen.
Doktor5000

Antworten:

5

ein bisschen spät zur Party, aber hoffentlich findet jemand dies nützlich:

find /usr/ -exec /bin/sh -c "rpm -qf {} &> /dev/null || echo {}" \;

Dieser Befehl durchsucht das Dateisystem und wird rpm -qfdarauf ausgeführt. rpm -qfdruckt das entsprechende Paket für eine Datei und hat glücklicherweise den Rückgabewert 0, wenn es eins findet, und andernfalls 1.

Wenn Sie mutig sind, können Sie die Ausgabe verknüpfen | xargs rm -f, aber ich persönlich wäre nicht so mutig. Es stellt sich heraus, dass es in / usr eine Menge Dinge gibt, die eigentlich nichts besitzen.

akors
quelle
3

Soweit mir bekannt ist, ist dies mit einem dedizierten Befehl nicht möglich, sondern nur über ein kleines Skript. TL; DR - siehe die Links unten. Und für RPM-basierte Systeme oder andere binärbasierte Paketmanager ist dies nicht sehr sinnvoll. Solche Paketmanager sind normalerweise zustandsbasierte Maschinen, die den Überblick über die Dinge behalten sollen, die sie selbst installieren, und nicht alles wissen sollen, was Benutzer "hinter dem Rücken" des Paketmanagers auf das System schleichen.

Wo würden Sie die Grenze für Dateien ziehen, die nicht im Besitz von RPM-Dateien sind? Was ist mit temporären Dateien (think / tmp und / var / tmp) oder Caches (think / var / cache) oder Dateien, die von einem Benutzer (/ home oder / srv oder anderen benutzerdefinierten Mountpunkten) erstellt wurden?

Für quellenbasierte Distributionen kann es sinnvoll sein, diese Funktionalität anzubieten, wenn der Anwendungsfall sie darauf beschränkt FHS- Verzeichnisse beschränkt, die von "System" -Paketen wie / usr, / bin, / lib und ähnlichen verwendet werden, im Gegensatz zu z. B. / usr / local oder / Entscheiden Sie sich für Software von Drittanbietern.


In den folgenden ähnlichen Fragen finden Sie Skriptlets, mit denen Sie das tun können, wonach Sie gefragt haben:

doktor5000
quelle
3

Per /superuser/555918/how-do-i-list-all-the-files-not-owners-by-any-package-in-a-rpm-based-system wird der folgende Befehl ausgeführt ist eine solide Basis für das, was Sie brauchen:

comm -13 <(rpm -qla | sort) <(find / -type f | sort)

Fertigen Sie weiter durch Filtern der Befehl find auf Verzeichnisse von Interesse (entweder unter Angabe der Liste der Verzeichnisse statt /(zB /{usr,bin}) oder Ausschließen von Ordnern wie /proc, /dev, /home, und /tmp.

abschrecken
quelle
Vollständiger: comm -13 <(rpm -qla | sort | uniq) <(find / -xdev \( -type f -o -type d -o -type l \) | sort) Dadurch werden -ldie Dateien in allen installierten Paketen aufgelistet ( ) rpm -qaund sortiert. Anschließend werden Duplikate entfernt (da einige Verzeichnisse von mehreren Paketen bereitgestellt werden). Es findet auch alle Dateien auf der Root-Partition (ohne in andere Dateisysteme zu wechseln - -xdev) und gibt alle Dateien, Verzeichnisse und Symlinks ( \( -type f -o -type d -o -type l \)) zurück. Anschließend wird commder Vergleich durchgeführt, wobei nur die Einträge in der RPM-Liste ( -1) und die Einträge in beiden ( -3) ignoriert werden .
IBBoard
Beachten Sie auch, dass Sie möglicherweise sudobei der Suche verwenden müssen, damit Sie Dateien (insbesondere unter / etc) finden können, auf die nur root zugreifen kann.
IBBoard