Tìm các gói được cài đặt từ một kho lưu trữ nhất định có khả năng


39

Tôi đang tìm kiếm một cái gì đó tương tự với câu hỏi này: Zypper: Làm cách nào để hiển thị tất cả các gói từ một kho lưu trữ nhất định?

Vì tôi đang sử dụng Ubuntu, tôi cần một giải pháp dựa trên năng khiếu: Làm thế nào tôi có thể nhận được danh sách các gói đã cài đặt từ một kho lưu trữ nhất định?

Câu trả lời:


17

Sử dụng aptitude, để tìm kiếm các gói đã cài đặt bên ngoài nhánh ổn định, bạn có thể sử dụng:

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

Để xem các phiên bản cũng như tên gói (và thay vì mô tả), bạn có thể sử dụng lệnh với tùy chọn định dạng ( -Fviết tắt), như sau.

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

Để biết thêm các định dạng, vui lòng xem tại trang này (tài liệu ở đây có các tùy chọn tận dụng ).

Điều đó hoạt động chẳng hạn, trong Debian nếu bạn đã cài đặt các gói bên ngoài Squeeze (ví dụ bằng cách chạy , apt-get install -t sid package-name.

Bạn có thể xem gói cài đặt đến từ đâu thông qua apt-cache policy, cách sử dụng như sau:

apt-cache policy <package-name>

Ví dụ, gói python-numpy của tôi hiển thị đầu ra sau:

$ 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

Điều đó có nghĩa là tôi là một phiên bản phía sau chi nhánh sid / main hiện tại, vì vậy tôi đã cài đặt phiên bản sid-sid cũ. Tôi thấy tôi không có cái ổn định vì nó chưa có 1.4.1-5, và tôi hiện đang ở 1.6.2-1.

Tại thời điểm gửi, gói này đã được cập nhật :)


Tôi thích ?any-version(), bởi vì ~narrow(pat1, pat2)giống như ?any-version(pat1 pat2)và nó hỗ trợ ?any-version(pat1 pat2 pat3)mà không nhìn ngu ngốc.
Robert Siemer

18

Sau khi đọc trang thông tin về năng khiếu và hàng tá nỗ lực, cuối cùng tôi đã nhận được điều này:

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

hoặc tương đương) :

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

Nó sẽ tìm kiếm các gói được cài đặt từ kho lưu trữ không ổn định của bất kỳ kho lưu trữ nào . Bạn phải lọc ra các gói từ kho lưu trữ mặc định của bạn (ví dụ thử nghiệm ở trên).

Nếu bạn muốn lọc các gói được cài đặt từ www.debian-multidia.org/un Ổn định:

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

Chỉnh sửa: Lưu trữ trên mạng, các ứng dụng khác có thể được trích từ Releasetập tin lưu trữ. Thật không may, không phải tất cả các công cụ đều có thể xem xét tất cả các dòng đó và chúng sử dụng các cú pháp khác nhau cho chúng. Bạn có thể tìm thấy những tập tin như /var/lib/apt/lists/*Release. Hoặc chỉ cần gõ apt-cache policyđể có được một cái nhìn tổng quan. apt-cache đã thay đổi định dạng đầu ra: các phiên bản mới hơn sử dụng kiểu apt_preferences.

  • Suite:hoặc Archive:(tên cũ!)
    • tìm kiếm năng khiếu: ?archive(___)hoặc~A___
    • định dạng năng khiếu: %t
    • apt_preferences: release a=___
    • Ubuntu ví dụ: natty-backports, trusty-security,stable
  • Origin:
    • tìm kiếm năng khiếu: ?origin(___)hoặc~O___
    • định dạng năng khiếu: không có
    • apt_preferences: release o=___
    • Ví dụ Ubuntu: Canonical, Google, Inc., LP-PPA-dockbar-main,Ubuntu
  • tất cả các dòng khác
    • năng khiếu: không có

15

Kiểm tra thẻ gốc (chẳng hạn như o = Debian ) cho từng kho lưu trữ hiện tại của bạn:

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

Sau đó tìm kiếm các gói từ (hoặc không từ) một nguồn gốc cụ thể:

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

Điều này không phù hợp cho kiểm toán bảo mật vì nó dựa vào mỗi kho lưu trữ để cung cấp thông tin nguồn gốc của riêng nó, nhưng nó có thể hữu ích để khắc phục sự cố nguồn gốc của các gói có trong nhiều kho lưu trữ.


2
aptitude searchMô hình của bạn không tốt. - Họ chọn giống như các gói danh sách này trong đó có một phiên bản được cài đặt và bất kỳ phiên bản nào khác tồn tại trong Debian phiên bản hoặc một số phiên bản được cài đặt và ít nhất một phiên bản của gói đó có sẵn trên Debian Debian. - Thứ chúng tôi tìm kiếm là phiên bản được cài đặt là của Debian (hoặc không). Điều này phải được thực hiện với ?narrow()hoặc ?any-version().
Robert Siemer

Khẳng định. Tôi đã cài đặt nemo-filerollertừ linuxmint, nhưng nó cũng tồn tại Debian. Vì vậy, nó xuất hiện trong danh sách, vì nó được cài đặt tồn tại ở đâu đó từ Debian.
Boldewyn

6

Để hoàn thiện: Trên các hệ thống Ubuntu, bạn cũng có thể sử dụng Synaptic cho tác vụ này. Trong cột bên trái, bạn có thể lọc các gói theo nguồn gốc của chúng.


Tôi đã cố gắng làm điều này và tìm thấy bài đăng SU này qua Google, không thể tin rằng tôi đã bỏ qua Synaptic, cảm ơn!
David Claridge

@RobertSiemer Có thể điều đó đã khiến bạn chú ý, rằng tôi đã chấp nhận nó sau hai ngày với câu trả lời đầy đủ, và trước khi bất kỳ câu trả lời nào khác được đưa vào. Tôi đã chấp nhận nó, bởi vì nó đã giải quyết vấn đề của tôi . Tôi cũng nêu lên tất cả các câu trả lời sau này , nhưng, tôi xin lỗi, không bao giờ thay đổi trạng thái chấp nhận. Bạn cũng sẽ lưu ý về Câu hỏi thường gặp của trang web này, rằng tôi chưa rút được bất kỳ lợi ích danh tiếng nào từ động thái này, trong thực tế, tôi đã mất 2 đại diện vì không chấp nhận câu trả lời của người khác . Vì vậy, xin vui lòng lùi lại một bước trong tương lai trước khi phán xét quyết định của ai đó ở nơi công cộng và suy nghĩ lại về các nguyên nhân có thể.
Boldewyn

2

Tôi đã tìm thấy điều này:

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

Bạn cũng có thể tìm thấy một danh sách các thuật ngữ tìm kiếm được hỗ trợ bởi "tìm kiếm năng khiếu" tại đây .


Tại sao bạn cần chạy cái này với sudo? Dường như với tôi rằng điều này cũng hoạt động mà không chạy nó như root.
Andre Holzner

Nó không cần phải được chạy với sudo
Kurtis Nusbaum

Như tôi đã nhận xét về câu trả lời @Anonymous, điều này không có hiệu quả mong muốn.
Robert Siemer

2

Đầu tiên, tìm (các) tệp thích hợp cho kho lưu trữ quan tâm trong / var / lib / apt / list. Có thể làm điều này theo chương trình, nhưng tôi không cần phải làm như vậy.

Sử dụng google chrome làm ví dụ, hãy thử điều này:

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

và tôi nhận được đầu ra:

google-chrome-stable

dpkg -s trả về 0 nếu gói được cài đặt và khác không. Đối với mục đích tham khảo trong tương lai, đầu ra của

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

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

... cái này có dùng năng khiếu không?
Robert Siemer

2
@RobertSiemer Nó có liên quan như thế nào? Câu hỏi, giả sử một lệnh tiếng Anh hợp lý, là làm thế nào để tìm nguồn của các gói được cài đặt với năng khiếu . Không có yêu cầu rằng giải pháp sử dụng năng khiếu.
Auspex

@Auspex, tôi tin khác. - Và đừng lo lắng, khả năng tiếng Anh của tôi đã vượt qua mức độ hợp lý, cách đây vài năm.
Robert Siemer

2
Rõ ràng là không ...
Auspex

2
@Auspex: bạn đang cố gắng khiêu khích tôi? Điều ngược lại là đúng: câu hỏi là yêu cầu một giải pháp dựa trên năng khiếu, không phải cho các gói được cài đặt với năng khiếu.
Robert Siemer

0

Các câu trả lời khác thực sự không chính xác, bởi vì tham số đến ?archive()là một biểu thức chính quy. Vì vậy, ?archive(stable)phù hợp với cả stableunstable. Để loại trừ chỉ cần stablebạn cần neo mẫu regex:

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

Để loại trừ nhiều kho lưu trữ:

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

Cũng lưu ý rằng một số gói thuộc về nhiều kho, ví dụ xenial-security,xenial-updates. ?archive()đánh giá mẫu regex theo từng kho lưu trữ riêng lẻ, do đó ?archive("^xenial-updates$")sẽ khớp với bất kỳ gói nào thuộc về xenial-updates, ngay cả khi nó cũng thuộc về các kho lưu trữ khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.