Suchen Sie nach Paketen, die von einem bestimmten Repository mit Eignung installiert wurden


Antworten:


17

Mit aptitude können Sie nach installierten Paketen außerhalb des Stable-Zweigs suchen:

aptitude search "?narrow(?installed,?not(?archive(stable)))"

Um Versionen sowie Paketnamen (und anstelle von Beschreibungen) anzuzeigen, können Sie den Befehl mit der Formatoption ( -Fkurz) wie folgt verwenden.

aptitude search -F "%p %V %v" "?narrow(?installed,?not(?archive(stable)))"

Weitere Formate finden Sie in der Manpage (Dokumentation mit verfügbaren Optionen ).

Das funktioniert zum Beispiel in Debian, wenn Sie Pakete außerhalb von Squeeze installiert haben (zum Beispiel durch Ausführen von apt-get install -t sid package-name.

Sie können nachsehen, woher ein installiertes Paket stammt apt-cache policy. Die Verwendung ist wie folgt:

apt-cache policy <package-name>

Beispielsweise gibt mein Paket python-numpy die folgende Ausgabe aus:

$ LANG=C apt-cache policy python-numpy
python-numpy:
  Installed: 1:1.6.2-1
  Candidate: 1:1.6.2-1.2
  Version table:
     1:1.7.0-1 0
          1 http://ftp.es.debian.org/debian/ experimental/main amd64 Packages
     1:1.6.2-1.2 0
        500 http://ftp.es.debian.org/debian/ sid/main amd64 Packages
 *** 1:1.6.2-1 0
        100 /var/lib/dpkg/status
     1:1.4.1-5 0
        990 http://ftp.es.debian.org/debian/ squeeze/main amd64 Packages
        990 http://ftp.de.debian.org/debian/ squeeze/main amd64 Packages

Das bedeutet, dass ich eine Version hinter dem aktuellen sid / main-Zweig bin, also habe ich eine alte Sid-Version installiert. Ich sehe, ich habe noch keinen Stall, weil er noch ist 1.4.1-5, und ich bin gerade bei 1.6.2-1.

Zum Zeitpunkt der Einreichung wurde dieses Paket bereits aktualisiert:)


Ich bevorzuge ?any-version(), weil ~narrow(pat1, pat2)es genauso ist ?any-version(pat1 pat2)und es unterstützt, ?any-version(pat1 pat2 pat3)ohne dumm auszusehen.
Robert Siemer

18

Nachdem ich die Infoseite von aptitude und ein Dutzend Versuche gelesen hatte, bekam ich endlich Folgendes:

aptitude search '?narrow(?installed,?not(?archive(testing)) ?archive(unstable))'

oder gleichwertig) :

aptitude search '~S ~i (!~Atesting ~Aunstable)'

Es wird Paketen suchen aus instabilen Archiven der installierten beliebigen Repository. Sie müssen Pakete aus Ihrem Standardarchiv herausfiltern (Test in obigem Beispiel).

Wenn Sie Pakete filtern möchten, die von www.debian-multimedia.org/unstable installiert wurden:

aptitude search '~S ~i (!~Atesting ~Aunstable ?origin("Unofficial Multimedia Packages"))

Bearbeiten: "Archiv", "Herkunft" usw. werden von der ReleaseDatei des Repository abgezogen . Leider können nicht alle Tools alle diese Zeilen anzeigen und verwenden für sie unterschiedliche Syntax. Sie finden diese Dateien als /var/lib/apt/lists/*Release. Oder tippen Sie einfach apt-cache policy, um sich einen Überblick zu verschaffen. apt-cache hat das Ausgabeformat geändert: In späteren Versionen wird der Stil apt_preferences verwendet.

  • Suite:oder Archive:(alter Name!)
    • Eignungssuche: ?archive(___)oder~A___
    • Eignungsformat: %t
    • apt_preferences: release a=___
    • Ubuntu Beispiele: natty-backports, trusty-security,stable
  • Origin:
    • Eignungssuche: ?origin(___)oder~O___
    • Eignungsformat: n / a
    • apt_preferences: release o=___
    • Ubuntu Beispiele: Canonical, Google, Inc., LP-PPA-dockbar-main,Ubuntu
  • alle anderen Zeilen
    • Eignung: n / a

15

Untersuchen Sie das Origin-Tag (wie z. B. o = Debian ) für jedes Ihrer aktuellen Repositorys:

apt-cache policy | sed -n 's/.*o=\([^,]\+\).*/\1/p' | uniq

Dann suchen Sie nach Paketen von (oder nicht von) einem bestimmten Ursprung:

aptitude search "?installed?origin(Debian)"
aptitude search "?installed?not(?origin(Debian))"

Dies ist für eine Sicherheitsüberprüfung nicht geeignet, da jedes Repository seine eigenen Herkunftsinformationen bereitstellt. Es kann jedoch hilfreich sein, um die Herkunft von Paketen zu ermitteln, die in mehreren Repositorys vorhanden sind.


2
Deine aptitude searchMuster sind nicht gut. - Sie wählen wie folgt "Pakete auflisten, bei denen eine Version installiert ist und eine andere Version in Debian vorhanden ist" oder "eine installierte Version und mindestens eine Version dieses Pakets, die auf Nicht-Debian verfügbar ist". - Was wir suchen, ist "die installierte Version ist von Debian (oder nicht)". Dies muss mit ?narrow()oder geschehen ?any-version().
Robert Siemer

Bestätigt. Ich habe installiert nemo-filerolleraus linuxmint, aber es existiert in Debianauch. Also erscheint es in der Liste, weil es irgendwo von Debian installiert ist und existiert.
Boldewyn

6

Der Vollständigkeit halber: Auf Ubuntu-Systemen können Sie Synaptic auch für diese Aufgabe verwenden. In der linken Spalte können Sie Pakete nach ihrer Herkunft filtern.


Ich habe versucht, dies zu tun und habe diesen SU-Beitrag über Google gefunden. Ich kann nicht glauben, dass ich Synaptic übersehen habe. Danke!
David Claridge

@RobertSiemer Es könnte Ihre Aufmerksamkeit verloren haben, dass ich es nach zwei Tagen ohne ausreichende Antwort und bevor eine der anderen Antworten einging, angenommen habe . Ich habe es angenommen, weil es mein Problem gelöst hat. Ich habe auch alle späteren Antworten positiv bewertet , aber ich bitte um Verzeihung, den Akzeptanzzustand nie geändert. In den häufig gestellten Fragen (FAQs) auf dieser Website werden Sie auch feststellen, dass ich durch diesen Schritt keine Reputationsgewinne erzielt habe. Tatsächlich habe ich zwei Wiederholungen verloren, weil ich die Antwort eines anderen nicht akzeptiert habe . Machen Sie also bitte einen Schritt zurück in die Zukunft, bevor Sie Entscheidungen in der Öffentlichkeit beurteilen und die möglichen Ursachen überdenken.
Boldewyn

2

Ich habe folgendes gefunden:

aptitude search "?origin (<repository>) ?installed"

Hier finden Sie auch eine Liste der Suchbegriffe, die von "aptitude search" unterstützt werden .


Warum müssen Sie dies mit ausführen sudo? Es scheint mir, dass dies auch funktioniert, ohne es als root auszuführen.
Andre Holzner

Es muss nicht mit sudo ausgeführt werden
Kurtis Nusbaum

Wie ich auf @Anonymous antworte, hat dies nicht den gewünschten Effekt.
Robert Siemer

2

Suchen Sie zuerst in / var / lib / apt / lists die entsprechende (n) Datei (en) für das Repository von Interesse. Es sollte möglich sein, dies programmatisch zu tun, aber ich musste es nicht tun.

Versuchen Sie es am Beispiel von Google Chrome:

SEARCH_PATTERN=dl.google.com_linux_chrome  # adjust to suit your needs

for PKG in $( grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages | sed 's/^Package: //' )
do
    if dpkg -s "${PKG}" 2> /dev/null 1> /dev/null
    then
        echo ${PKG}
    fi
done

und ich bekomme die Ausgabe:

google-chrome-stable

dpkg -s gibt 0 zurück, wenn das Paket installiert ist, andernfalls ungleich Null. Für zukünftige Referenzzwecke wird die Ausgabe von

grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages

war

Package: google-chrome-beta
Package: google-chrome-stable
Package: google-chrome-unstable

... nutzt das Eignung?
Robert Siemer

2
@RobertSiemer Wie ist das relevant? Unter der Annahme vernünftiger Englischkenntnisse stellt sich die Frage, wie man die Quelle von Paketen findet, die mit aptitude installiert wurden . Es ist nicht erforderlich, dass die Lösung aptitude verwendet.
Auspex

@Auspex, ich glaube anders. - Und keine Sorge, meine Englischkenntnisse haben sich vor ein paar Jahren als "vernünftig" erwiesen.
Robert Siemer

2
Anscheinend nicht ...
Auspex

2
@Auspex: Versuchst du mich zu provozieren? Das Gegenteil ist der Fall: Es wird nach einer auf aptitude basierenden Lösung gefragt, nicht nach Paketen, die mit aptitude installiert wurden.
Robert Siemer

0

Die anderen Antworten sind tatsächlich falsch, da der Parameter to ?archive()ein regulärer Ausdruck ist. Also ?archive(stable)passt beides stableund unstable. Um nur auszuschließen stable, müssen Sie das Regex-Muster verankern:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^stable$")))'

So schließen Sie mehrere Repositorys aus:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^(xenial|xenial-updates)$")))'

Beachten Sie auch, dass einige Pakete zu mehreren Repositorys gehören, z xenial-security,xenial-updates. ?archive()wertet das Regex-Muster für jedes Repository einzeln aus, sodass ?archive("^xenial-updates$")es mit allen Paketen übereinstimmt, die zu gehören xenial-updates, auch wenn es zu anderen Repositorys gehört.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.