ฉันจะแสดงรายการโปรแกรมที่ติดตั้งทั้งหมดได้อย่างไร


48

ฉันจะแสดงรายการโปรแกรมทั้งสองที่มาพร้อมกับการแจกจ่ายและที่ฉันติดตั้งด้วยตนเองได้อย่างไร


8
การกระจายแบบไหน การกระจายแต่ละครั้งมีเครื่องมือติดตั้งที่แตกต่างกัน
Matteo

อืมฉันสนใจ Red Hat, Ubuntu และ cygwin มีวิธีการกระจายรายชื่อโปรแกรมที่มีอาร์กิวเมนต์บรรทัดคำสั่งหรือไม่?
InquilineKea

1
ไม่ไม่มีเนื่องจากแพ็คเกจผู้จัดการแตกต่างกัน
Chris Down

คำตอบ:


71

ขึ้นอยู่กับการกระจายของคุณ

  • การแจกแจงตามความถนัด (Ubuntu, Debian, ฯลฯ ): dpkg -l
  • การกระจายแบบ RPM (Fedora, RHEL และอื่น ๆ ): rpm -qa
  • pkg * - การกระจายแบบอิง (OpenBSD, FreeBSD, ฯลฯ ): pkg_info
  • การแจกแจงตามพอร์ต (Gentoo เป็นต้น): equery listหรือeix -I
  • pacman-based distributions (Arch Linux, ฯลฯ ): pacman -Q
  • Cygwin: cygcheck --check-setup --dump-only *
  • Slackware: slapt-get --installed

ทั้งหมดเหล่านี้จะแสดงรายการแพคเกจมากกว่าโปรแกรมอย่างไร หากคุณต้องการแสดงรายการโปรแกรมอย่างแท้จริงคุณอาจต้องการแสดงรายการไฟล์โปรแกรมในโปรแกรม$PATHซึ่งสามารถทำได้โดยใช้ bash's compgen:

compgen -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
และสำหรับระบบ RPM ตาม (Red Hat, SuSE, CentOS, ฯลฯ ):rpm -qa
เลขที่

1
Debian / Ubuntu dkpg -l | grep ^iiคือ
Rolf

1
@Rolf คุณหมายถึง dPKg
HarkályGergő

1
Hrmph ... BSDs ไม่ใช่ลีนุกซ์ลีนุกซ์ ...
Kusalananda

1
@ Kusalananda Huh? คำตอบนี้ไม่ได้บอกว่า BSDs คือลีนุกซ์ลีนุกซ์, แต่เป็นดิสทริบิวชัน . นั่นคือสิ่งที่ "D" ใน BSD หมายถึง
Chris Down

13

ตอบคำถามในส่วนที่สอง (ไม่มีอะไรให้เพิ่มเข้าไปในคำตอบของ Chrisสำหรับส่วนแรก) :

โดยทั่วไปจะไม่มีวิธีในการแสดงรายการโปรแกรมที่ติดตั้งด้วยตนเองและส่วนประกอบต่างๆ สิ่งนี้จะไม่ถูกบันทึกไว้ที่ใดถ้าคุณไม่ได้ใช้ตัวจัดการแพคเกจ ทั้งหมดที่คุณสามารถทำคือการหาไบนารีในสถานที่มาตรฐาน (เช่นคริสแนะนำ) และในลักษณะที่คล้ายกันคาดเดาที่บางห้องสมุดหรือบางหน้าคู่มือ ฯลฯ มาจาก นั่นคือเหตุผลที่เมื่อใดก็ตามที่เป็นไปได้คุณควรติดตั้งโปรแกรมโดยใช้ตัวจัดการแพคเกจของคุณ


3

โปรแกรมควรสามารถเข้าถึงได้ผ่านทาง PATH ดังนั้นเพียงแสดงรายการทุกอย่างในเส้นทาง:

ls ${PATH//:/ }

คาดว่าผลลัพธ์ของโปรแกรมประมาณ 3k-4k

ในการยกเว้นส่วนน้อยที่เป็นไปได้ของการบวกผิดคุณอาจปรับแต่งวิธีการ:

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

มันไม่ได้สร้างความแตกต่างให้ฉัน


2
โปรดทราบว่านี่อาจเป็นรายการที่ไม่ใช่โปรแกรมเช่นกัน (ไดเรกทอรีย่อยของไดเรกทอรี$PATHเป็นต้น)
Chris Down

1
ฉันได้เพิ่มการทดสอบ แต่มันก็ไม่ได้สร้างความแตกต่างให้ฉัน (มีประโยชน์มากแค่ไหนที่ไดเรกทอรีในไดเรกทอรีในเส้นทางซึ่งไม่ได้อยู่ในเส้นทางนั้น) แต่สำหรับกรณีที่คุณต้องใช้ความถูกต้องอาจเป็นประโยชน์
ผู้ใช้ที่ไม่รู้จัก

1
น่ากลัว! ผมไม่สามารถที่จะรู้ว่ารุ่นของลินุกซ์ (เรื่องยาว - แต่ไม่มีอะไรผิดทางอาญา) แต่รหัสนี้บันทึกวันของฉัน :)
obenjiro

2

คำตอบอื่น ๆ ทั้งหมด (จนถึง) จัดการกับแพ็คเกจและไบนารี หากคุณหมายถึง "แอปพลิเคชันเดสก์ท็อป" สิ่งที่ปรากฏในเมนูเริ่มของคุณคุณสามารถลอง:

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

การแก้ปัญหาอื่น ๆ ในคำถามอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.