Làm thế nào để tôi liệt kê tất cả các chương trình cài đặt?


49

Làm cách nào để liệt kê cả hai chương trình đi kèm với bản phân phối của tôi và những chương trình tôi đã cài đặt thủ công?


8
Phân phối nào? Mỗi bản phân phối có các công cụ cài đặt khác nhau.
Matteo

Hừm, tôi thích Red Hat, Ubuntu và cygwin. Có cách nào phân phối để liệt kê các chương trình với một số đối số dòng lệnh không?
InquilineKea

1
Không, không có, vì các nhà quản lý gói khác nhau.
Chris Xuống

Câu trả lời:


72

Điều đó phụ thuộc vào phân phối của bạn.

  • Các bản phân phối dựa trên năng lực (Ubuntu, Debian, v.v.): dpkg -l
  • Các bản phân phối dựa trên RPM (Fedora, RHEL, v.v.): rpm -qa
  • phân phối dựa trên pkg * (OpenBSD, FreeBSD, v.v.): pkg_info
  • Phân phối dựa trên portage (Gentoo, v.v.): equery listhoặceix -I
  • bản phân phối dựa trên pacman (Arch Linux, v.v.): pacman -Q
  • Cygwin: cygcheck --check-setup --dump-only *
  • Slackware: slapt-get --installed

Tất cả những thứ này sẽ liệt kê các gói hơn là các chương trình . Nếu bạn thực sự muốn liệt kê các chương trình, có lẽ bạn muốn liệt kê các chương trình thực thi trong $PATHđó, có thể được thực hiện như vậy bằng cách sử dụng bash's compgen:

compgen -c

Hoặc, nếu bạn không có compgen:

#!/bin/bash
IFS=: read -ra dirs_in_path <<< "$PATH"

for dir in "${dirs_in_path[@]}"; do
    for file in "$dir"/*; do
        [[ -x $file && -f $file ]] && printf '%s\n' "${file##*/}"
    done
done

4
Và đối với các hệ thống dựa trên RPM (Red Hat, SuSE, CentOS, v.v.):rpm -qa
nos

1
Debian / Ubuntu là dkpg -l | grep ^ii.
Rolf

1
@Rolf, ý bạn là dPKg
Harkály Gergő

1
Hrmph ... Các BSD không phải là bản phân phối Linux ...
Kusalananda

1
@Kusalananda Hả? Không có điểm nào trong câu trả lời này nói rằng BSD là bản phân phối Linux, nhưng chúng là bản phân phối . Đó là nghĩa đen của chữ "D" trong BSD.
Chris Xuống

13

Trả lời phần thứ hai của câu hỏi (không có gì thực sự được thêm vào câu trả lời của Chris cho phần đầu tiên) :

Nhìn chung không có cách nào để liệt kê các chương trình được cài đặt thủ công và các thành phần của chúng. Điều này không được ghi lại ở bất cứ đâu nếu bạn không sử dụng trình quản lý gói. Tất cả các bạn có thể làm là tìm những chương trình tại các địa điểm tiêu chuẩn (như Chris gợi ý) và theo một cách tương tự, đoán nơi một số thư viện hoặc một số trang hướng dẫn, vv đến từ đâu. Đó là lý do tại sao, bất cứ khi nào có thể, bạn nên luôn cài đặt các chương trình bằng trình quản lý gói của mình .


3

Các chương trình nên có thể truy cập thông qua PATH, vì vậy chỉ cần liệt kê mọi thứ trong đường dẫn:

ls ${PATH//:/ }

Mong đợi một kết quả của khoảng 3k-4k chương trình.

Để loại trừ một nhóm thiểu số có thể có dương tính giả, bạn có thể tinh chỉnh cách tiếp cận:

for d in ${PATH//:/ } ; do 
    for f in $d/* ; do  
        test -x $f && test -f $f && echo $f
    done
done

Nó không tạo ra sự khác biệt đối với tôi.


2
Lưu ý rằng điều này cũng sẽ có khả năng liệt kê các chương trình phi chương trình khác nhau (thư mục con của các thư mục trong $PATH, v.v.).
Chris Xuống

1
Tôi đã thêm một bài kiểm tra, nhưng nó không tạo ra sự khác biệt đối với tôi (thư mục trong thư mục trong đường dẫn hữu ích như thế nào?). Nhưng đối với các trường hợp, nơi bạn dựa vào tính chính xác, nó có thể hữu ích.
người dùng không xác định

1
tuyệt vời! Tôi không thể biết phiên bản Linux (câu chuyện dài - nhưng không có tội phạm gì) nhưng mã này đã cứu ngày của tôi :)
obenjiro

2

Tất cả các câu trả lời khác (cho đến nay) đối phó với các gói và nhị phân. Nếu bạn có nghĩa là "ứng dụng máy tính để bàn", những ứng dụng xuất hiện trong menu bắt đầu của bạn, bạn có thể thử:

ls /usr/share/applications | awk -F '.desktop' ' { print $1}' -

Nhiều giải pháp trong một câu hỏi 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.