การสร้างรายการแพคเกจที่ติดตั้งด้วยตนเองและการสืบค้นแต่ละแพ็คเกจ


183

ฉันต้องการรับรายการแพคเกจที่ติดตั้งด้วยตนเองโดยaptหรือaptitudeและสามารถค้นหาว่ามีการfoobarติดตั้งแพคเกจด้วยตนเองหรือโดยอัตโนมัติ มีวิธีการทำอย่างประณีตจากบรรทัดคำสั่งหรือไม่


ดูคำตอบนี้ได้ที่ unix.stackexchange.comสำหรับวิธีการแก้ปัญหาที่กรองแพ็กเกจสต็อก
Dirk Bergstrom

เป็นไปได้ซ้ำไหม - askubuntu.com/questions/365
jrg


ทางออกที่ดีจริงๆที่ไม่รวมแพ็คเกจที่ติดตั้งโดยค่าเริ่มต้น: รายการ Ubuntu แพคเกจที่ติดตั้งไว้อย่างชัดเจน
pcworld

ระมัดระวังในการแสดงความคิดเห็นคำตอบที่นี่ ผู้คนไม่ได้บอกว่าจะมีวิธีแสดงแพคเกจเพิ่มเติมมากขึ้น แต่พวกเขาก็ลืมว่ามีแพ็คเกจอ้างอิงที่ติดตั้งจากคู่มือ
Andre Figueiredo

คำตอบ:


206

คุณสามารถใช้หนึ่งในสอง liners อย่างใดอย่างหนึ่ง ทั้งคู่ให้ผลลัพธ์ที่เหมือนกันบนเครื่องของฉันและแม่นยำกว่าโซลูชันทั้งหมดที่เสนอจนถึงตอนนี้ (6 กรกฎาคม 2014) ในคำถามนี้

การใช้apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

การใช้aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

แพคเกจน้อยมากยังคงตกอยู่ในรอยแตกแม้ว่าฉันจะสงสัยว่ามีการติดตั้งโดยผู้ใช้จริง ๆ ไม่ว่าหลังจากติดตั้งผ่านการตั้งค่าการแปลภาษาหรือเช่นผ่านตัวติดตั้ง Totem codec นอกจากนี้เวอร์ชันส่วนหัวของลินุกซ์ก็ดูเหมือนจะสะสมแม้ว่าฉันจะติดตั้ง metapackage ที่ไม่ใช่รุ่นเฉพาะเท่านั้น ตัวอย่าง:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

มันทำงานอย่างไร:

  1. รับรายการแพ็คเกจที่ติดตั้งด้วยตนเอง สำหรับความถนัดsedแถบเพิ่มเติมจะเหลือพื้นที่ว่างที่ท้ายบรรทัด
  2. รับรายการแพ็คเกจที่ติดตั้งทันทีหลังจากติดตั้งใหม่
  3. เปรียบเทียบไฟล์ให้แสดงบรรทัดในไฟล์ 1 ที่ไม่ปรากฏในไฟล์ 2 เท่านั้น

ความเป็นไปได้อื่น ๆ ก็ใช้งานไม่ได้เช่นกัน:

  • การใช้ubuntu-14.04-desktop-amd64.manifestไฟล์ ( ที่นี่สำหรับ Ubuntu 14.04) /var/log/installer/initial-status.gzแทน แพคเกจเพิ่มเติมจะแสดงเป็นติดตั้งด้วยตนเองแม้ว่าจะไม่
  • ใช้แทนapt-mark showauto ตัวอย่างเช่นไม่มีแพ็คเกจ xserver-xorg ในขณะที่ไฟล์อื่นทำ/var/log/installer/initial-status.gzapt-mark

ฉันใช้โพสต์ StackExchange อื่น ๆ เป็นข้อมูลอ้างอิง แต่ก็ไม่มีวิธีใดทำงานได้ดีเหมือนโซลูชันข้างต้น:

ทั้งสองรายการมีแพ็คเกจมากกว่าโซลูชันด้านบน

แก้ไข: จะทำอย่างไรถ้าคุณอัพเกรดจากรุ่นก่อนหน้า:

หากคุณอัพเกรด Ubuntu จากรุ่นหนึ่งเป็นรุ่นถัดไปคุณอาจต้องปรับกระบวนการนี้ ในกรณีนั้นฉันจะตรวจสอบไฟล์รายการของรีลีสที่ใหม่กว่า (ดูด้านบน) นอกเหนือจากไฟล์ initial-status.gz จากรีลีสปัจจุบัน คุณสามารถทำได้โดยเพียงแค่เพิ่มการเปรียบเทียบอื่น การใช้ไฟล์ Manifest จะไม่ทำงานเนื่องจากไฟล์ Manifest ไม่ได้มีทุกอย่างที่ไฟล์ initial_status.gz ทำ (ฉันตรวจสอบแล้ว)


7
สิ่งนี้ไม่ได้ผลสำหรับฉันเพราะ/var/log/installer/initial-status.gzขาดหายไป นอกจากนี้ฉันต้องการทราบว่านี้ขึ้นอยู่กับการทำเครื่องหมาย apts manualหรือไม่?
อันวาร์

1
อนิจจาไม่มีรายการสำหรับรุ่นเซิร์ฟเวอร์
Antti Haapala

ฉันรันshowmanualคำสั่ง (ด้านล่าง) และใช้commเพื่อเปรียบเทียบรายการทั้งสอง (เรียงลำดับ) showmanualผลให้ผม 1,840 เพิ่มเติมแพคเกจไม่ซ้ำกันจากapt-mark showmanualไม่ได้แสดงตามวิธีนี้ ไม่มีแพ็กเกจที่ไม่ซ้ำกันกับเอาต์พุตของcommคำสั่งนี้ ฉันคิดว่ามันน่าสนใจมากกว่าที่จะบันทึกว่าสำหรับพีซีของฉัน894แพ็คเกจมีการระบุไว้ในผลลัพธ์ทั้งสอง ไม่แน่ใจว่าทำไมมีความแตกต่างมากมาย แพคเกจบางรายการ (หลายรายการ) ดูเหมือนว่าจะออกวางจำหน่ายเฉพาะ คนอื่น ๆ เช่น xorg, ส่วนประกอบ GTK และlib*สิ่งที่อาจมีการปรับปรุง อย่างไรก็ตามคำตอบนี้เป็นการเริ่มต้นที่ดีมาก
จะ

apt-mark showmanualฉันเพียงแค่เมื่อเทียบกับการแก้ปัญหาของคุณ มันน่าสนใจที่เห็นความแตกต่างมากมาย รายการของคุณมี 238 แพ็คเกจในขณะที่ showmanual ส่งคืนแพ็คเกจ 1717 รายการ ในแพคเกจที่ติดตั้ง 2179 มีเพียง 223 ในทั้งสองรายการ 15 เฉพาะในของคุณ (ตัวอย่าง: nodejs, lightdm) และ 223 อยู่ใน showmanual เท่านั้น (ตัวอย่าง: xserver-xorg, ubuntu-desktop) รู้สึกว่ารายการของคุณมีประโยชน์มากกว่า แต่ไม่ทราบว่าความแตกต่างเหล่านี้มาจากไหนมันไม่ใช่เรื่องง่ายที่จะตัดสินใจ ... (แต่ฉันค่อนข้างแน่ใจว่าฉันติดตั้ง nginx และ lightdm ด้วยตนเอง ... ) [ขอโทษทีฉันจะเขียน เหมือนกัน;)]
Daniel Alder

64

ในเวอร์ชันที่ใหม่กว่าของแพ็คเกจ apt ยังมีคำสั่ง apt-mark

apt-mark showmanual

35
สิ่งนี้แสดงให้เห็นว่ามีแพ็คเกจมากกว่าที่ฉันติดตั้งด้วยตนเอง
Umang

1
@Umang คุณพูดถูก ฉันจะบอกว่านี่ไม่ใช่แบบนี้เมื่อฉันเขียนคำตอบนี้ ไม่มีเหตุผลในระบบของฉันที่จะต้องพิจารณาlinux-image-3.11.0-*-genericว่าเป็นคู่มือ ฯลฯ
Daniel Alder

1
@Umang อาจจะช่วยคุณถามUbuntu.com/questions/432743/…แต่คำตอบไม่ได้รับการยอมรับ ความจริงก็คือแพคเกจการติดตั้งใหม่จำนวนมากถูกทำเครื่องหมายเป็นคู่มือแล้ว แต่ก็ยังมีเรื่องแปลก ๆ ที่จะอยู่กับตัวอย่างของฉัน: linux-image-3.13.0-24-genericเป็นคู่มือ แต่ปัจจุบันlinux-image-3.13.0-27-genericเป็นไปโดยอัตโนมัติ ดูเหมือนว่าการอัพเกรดของแพคเกจการอ้างอิง (ในกรณีนี้linux-image-genericซึ่งเปลี่ยนการอ้างอิง) เครื่องหมายคู่มือจะถูกตั้งค่าโดยอัตโนมัติ
Daniel Alder

5
@DanielAlder บางแพ็คเกจของการติดตั้งใหม่ควรถูกทำเครื่องหมายเป็นแบบแมนนวล apt-get autoremoveหากไม่มีแพคเกจทำเครื่องหมายเป็นคู่มือระบบทั้งหมดจะถูกลบออกด้วย นี่ไม่ใช่สิ่งที่คุณต้องการอย่างแน่นอน
Anton K

2
หาก "ติดตั้งด้วยตนเอง" หมายถึง "ติดตั้งโดยผู้ใช้หลังการติดตั้งระบบปฏิบัติการเริ่มต้น" นี่ไม่ใช่คำตอบที่ถูกต้อง
เชมัส

21

สำหรับ Ubuntu 16.04 /var/log/apt/history.logตรวจสอบไฟล์บันทึก

ตัวอย่างเช่น:

zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz

มันไม่สมบูรณ์แบบ แต่มันก็ค่อนข้างดีที่ทำให้ชัดเจนว่าสิ่งที่ฉันติดตั้งด้วยมือ วาง-B 1บน grep เพื่อดูว่าเมื่อมันถูกติดตั้ง

ตัวอย่างผลลัพธ์

Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade

ไม่แน่ใจว่าจะหยิบขึ้นมาaptitudeหรือไม่ ดูเหมือนจะไม่ได้รับการติดตั้งจากแอพ Desktop Software ของ Ubuntu


1
จากคำตอบทั้งหมดในช่วงหลายปีที่ผ่านมานี่เป็นเพียงคำเดียวที่ใกล้เข้ามาในเซิร์ฟเวอร์ 18.04
Quentin Skousen

20

apt-mark showauto | grep -iE '^foobar$' จะส่งออก "foobar" ถ้าแพ็คเกจถูกติดตั้งโดยอัตโนมัติไม่มีอะไรเป็นอย่างอื่น

aptitude search '!~M ~i'จะแสดงรายการแพคเกจที่ไม่ได้ติดตั้งโดยอัตโนมัติ มันเป็นความถนัดที่น่าเสียดายที่ไม่ได้เป็นส่วนหนึ่งของการติดตั้งเริ่มต้นบน Ubuntu Desktop ตั้งแต่ 10.10


aptitude searchแสดงให้เห็นถึงแพ็คเกจทั้งหมดไม่ใช่แค่ชุดที่ติดตั้งด้วยตนเอง (ฉันคิดว่านั่นเป็นสิ่งที่ OP ต้องการ)
Oli

1
@Oli: ดูในรูปแบบการค้นหาความถนัด; รูปแบบที่ฉันใช้นั่นควรทำสิ่งที่ OP ต้องการอย่างแน่นอน
Li Lo

ฉันวิ่งมัน มันแสดงให้เห็นถึงบรรจุภัณฑ์ทั้งหมดที่ไม่ได้ติดตั้ง
Oli

7
มีบางอย่างไม่ถูกต้องฉันกำลังใช้งานอยู่aptitude search '!~M ~i'และมีรายชื่อแพ็คเกจ 1043 รายการ ไม่มีวิธีที่ฉันติดตั้งแพ็คเกจจำนวนมากด้วยตนเอง
ThatGraemeGuy

วิธีนี้ใช้ไม่ได้ตามที่ต้องการพิมพ์แพ็คเกจที่ติดตั้งไว้ล่วงหน้าเช่นกัน
Irfy

9

สคริปต์ต่อไปนี้จะพิมพ์แพ็คเกจทั้งหมดที่ไม่ได้ตั้งค่าเป็นการติดตั้งอัตโนมัติและด้วยเหตุนี้จึงถูกติดตั้งด้วยตนเอง:

#!/usr/bin/python

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

มันขึ้นอยู่กับวิธีการที่ apt-mark พิมพ์แพ็คเกจที่ติดตั้งโดยอัตโนมัติ


ขอชื่นชมคุณดี ใช้งานได้จริงตรงกันข้ามกับคำตอบที่ยอมรับ
Irfy

แสดงแค่สองสามแพ็คเกจสำหรับฉัน --- หายไปบ่อยมาก
Rmano

กันที่นี่ไม่มีแพ็คเกจที่ติดตั้งด้วยตนเองหายไปหลังจากติดตั้งแล้ว
David Ljung Madison

การใช้sys.exit(1)โดยไม่มีimport sysอาจส่งผลให้เกิดข้อผิดพลาดในงูหลามรุ่นใหม่กว่า อย่างใดอย่างหนึ่งหรือการใช้งานimport sys exit(1)
Videonauth

7

ในการรับรายการแพคเกจทั้งหมด (ไม่ได้ติดตั้งติดตั้งโดยผู้ใช้หรือติดตั้งโดยค่าเริ่มต้นใน PPAs ทั้งหมด) aptใช้วิธีการต่อไปนี้:

apt list [option]

ตัวเลือกที่เป็นไปได้มีประโยชน์สำหรับสิ่งนี้คือ:

--installed เพื่อแสดงเฉพาะแพ็คเกจที่ติดตั้งบนระบบ (จากทั้งหมด 50,000+ รายการ)

--manual-installedเพื่อแสดงรายการแพ็กเกจที่ติดตั้งอย่างชัดเจนโดยคำสั่งโดยตรงหรือเป็นการอ้างอิง

หรือคุณสามารถทำได้:

apt list --manual-installed | grep -F \[installed\] เพื่อรับรายการแพ็กเกจที่เป็นผลมาจากคำสั่งของผู้ใช้และการอ้างอิงของพวกเขาเท่านั้นและเพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับพวกเขาเช่นเวอร์ชันและสถาปัตยกรรมที่รองรับ (x86, x86_64, amd64, all, etc. )


5

ในฐานะที่เป็นคนหลายคนแสดงความคิดเห็น apt-mark showmanual ดูเหมือนว่าจะเป็นรถบั๊กกี้เล็กน้อย (และฉันรายงานว่าเป็นข้อผิดพลาด 727799 ) เมื่อฉันใช้มันจริง ๆ แล้วรายงานสิ่งต่าง ๆ มากมายที่ไม่ได้เข้าสู่ระบบ / var / lib / apt / extended_states (ที่นี้ควรจะเก็บไว้) และ apt-get ไม่ได้บันทึกสิ่งที่ติดตั้งใน / var / lib / apt / extended_states (เพียงใน / var / lib / dpkg / สถานะ) สคริปต์ python โดย txwikinger ด้านบนดึงมาจาก / var / lib / apt / extended_states โดยตรง แต่ถ้าคุณใช้วันนี้ไวยากรณ์อาจไม่ทำงาน (ของฉันเพิ่งเริ่มสร้างข้อผิดพลาดกับ Kubuntu 13.10) ไวยากรณ์ที่อัปเดตคือ:

#!/usr/bin/python
import sys

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

สำหรับฉันนี่เป็นรายการสั้น ๆ 5 รายการซึ่งดูเหมือนจะไม่ถูกต้องเช่นกัน


1
การใช้sys.exit(1)โดยไม่มีimport sysอาจส่งผลให้เกิดข้อผิดพลาดในงูหลามรุ่นใหม่กว่า อย่างใดอย่างหนึ่งหรือการใช้งานimport sys exit(1)
Videonauth

4

ฉันต้องการให้โซลูชัน GUI

ป้อนคำอธิบายรูปภาพที่นี่

  1. เปิด Synaptic Package Manager

  2. ไปที่ Status

  3. คลิก Installed (manual)

มันจะให้รายการแพคเกจที่ติดตั้งด้วยตนเองโดย apt หรือ aptitude

น่าเสียดายที่ฉันไม่พบตัวเลือกใด ๆ ในCustom Filtersการตรวจสอบว่ามีการfoobarติดตั้งแพคเกจด้วยตนเองหรือโดยอัตโนมัติ

หากแพ็กเกจอยู่ภายใต้Installedแต่ไม่อยู่ภายใต้แสดงInstalled (manual)ว่ามีการติดตั้งโดยอัตโนมัติ หากแพ็คเกจอยู่ภายใต้แสดงInstalled (manual)ว่ามีการติดตั้งด้วยตนเอง


2

ถ้าไม่มีใครให้คำตอบที่ดีโดยใช้คำสั่ง เม.ย. สิ่งที่คุณสามารถทำมันวิธีที่ยาก Apt-get เก็บข้อมูลไว้ใน / var / lib / apt / extended_states ไฟล์ใด ๆ ที่ติดตั้งโดยอัตโนมัติจะถูกเพิ่มลงในไฟล์นี้ หากคุณติดตั้งแพคเกจแล้วในไฟล์นี้ด้วยตนเองแพ็คเกจจะยังคงอยู่ในไฟล์นี้ แต่ติดตั้งอัตโนมัติ: 0 ในบรรทัดที่สอง มันไม่ถูกลบ

หมายเหตุ: ตามที่คาดไว้คำตอบที่ดีกว่าซึ่งน่าจะใช้ได้ถ้าการเปลี่ยนแปลงตำแหน่งไฟล์ปรากฏขึ้น ฉันเก็บไว้ในกรณีที่ข้อมูลเกี่ยวกับตำแหน่งไฟล์นั้นมีประโยชน์


1
ไม่ฉันลองดูไฟล์นั้นอย่างรวดเร็วเพื่อค้นหาว่า liferea ถูกทำเครื่องหมายว่าติดตั้งอัตโนมัติ ฉันทำapt-get install lifereaและมันไม่ได้ติดตั้ง แต่ฉันได้รับผลลัพธ์ที่เป็นสิ่งที่มีผลต่อการ "ทำเครื่องหมายว่าติดตั้งด้วยตนเอง" ตอนนี้ Liferea ยังคงอยู่ในไฟล์ยกเว้นบรรทัดถัดไปมีแทน0 1นอกจากนี้คุณควรเปลี่ยนรูปแบบ regex ของคุณเพื่อแทนเพียง" foobar$" foobar
Umang

นั่นเป็นเรื่องจริง ความผิดของฉันในระบบของฉันไม่มีบรรทัดที่เป็น 0 แต่มันน่าจะเกิดขึ้นได้ยาก ฉันจะปรับปรุงคำตอบในกรณีที่
Javier Rivera

2

หลังจาก googling ไปมากฉันก็สามารถรวบรวมสคริปต์นี้ได้ มันใช้งานได้ดีสำหรับฉัน:

# List of all packages currently installed
current=$(dpkg -l | awk '{print $2}' | sort | uniq)

# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)

# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)

# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )

for pack in $packages; do
    packname=$(echo $pack | cut -f 1 -d ":")
    desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
    date=$(date -r /var/lib/dpkg/info/$pack.list)

    echo "# $desc"
    echo "# $date"
    echo "sudo apt-get install $pack"
    echo -e ""
done

คุณสามารถใช้แทนsort -u sort | uniqueในฐานะที่apt-markไม่แสดงสถาปัตยกรรมที่คุณควรจะดึงมันออกมาจาก dpkg เอาท์พุทก่อนที่จะดำเนินงานที่ตั้งไว้ (หรือใช้dpkg-query -W -f='${Package}\n') นอกจากนี้ dpkg อาจแสดงรายการแพ็คเกจที่ไม่ได้ติดตั้งในปัจจุบัน สำหรับ "desc" คุณสามารถใช้ `dpkg-query -W -f = '# $ {binary: Summary} \ n' $ pack ซึ่งเร็วกว่า
jarno

โอ้apt-markอาจแสดงสถาปัตยกรรมสำหรับแพคเกจบางอย่าง dpkg -lแต่ไม่ได้สำหรับจำนวนมากดังนั้นตาม
jarno

apt-cache searchช้า การรับรายการวันที่ติดตั้งล่วงหน้าโดยใช้บางอย่างเช่นhelp.ubuntu.com/community/ListInstalledPackagesByDateอาจมีประสิทธิภาพมากขึ้น
opticyclic

1

ในฐานะที่เป็น Li Lo กล่าวว่าคุณapt-mark showautoควรได้รับรายชื่อของสิ่งที่ติดตั้งโดยอัตโนมัติ

ตอนนี้เพื่อแสดงสิ่งที่ติดตั้งด้วยตนเองมันกลับกลายเป็นว่ามีตัวแก้ไขการค้นหาที่เรียบง่ายน่ารักสำหรับความถนัด แต่คุณไม่ต้องการทำเช่นนั้น คุณต้องการเขียนคำสั่ง bash ขนาดใหญ่ที่ทำวิทยาศาสตร์จรวด

หมายเหตุ:นี่เป็นภาพประกอบที่แสดงให้เห็นว่าคุณเจ๋งมากแค่ไหนที่ดูคำสั่งทุบตีขนาดใหญ่กับเพื่อนของคุณ

comm -3  <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)

ฉันทำลายมันลงบนสองบรรทัดเพื่อให้สามารถอ่านได้ สิ่งนี้ทำอะไร

  • ก่อนอื่นเราจะสอบถาม dpkg สำหรับรายการแพ็คเกจที่ติดตั้ง
  • เรากรองสิ่งเหล่านั้นสำหรับสิ่งที่ติดตั้งจริง (ไม่ใช่แค่การตั้งค่าที่เหลือ)
  • เราตัดสถานะออก
  • เราเปรียบเทียบรายการนั้นกับรายการอัตโนมัติจาก apt-mark
  • เราเขย่าเพราะเราทำได้

ฉันสงสัยว่ามันถูกต้องเนื่องจาก dpkg มักจะแสดงแพ็คเกจที่ไม่ได้ติดตั้ง
txwikinger

ฉันรู้ว่าคุณหมายถึงอะไร แต่ bash-fu ของฉันไม่แข็งแรงพอ ฉันรู้ว่าคุณสามารถแสดงสถานะจาก dpkg-query, grep นั้นและจากนั้นตัดสถานะออก ฉันจะไป
Oli

comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)ดีกว่า;)
LassePoulsen

-1

นี่จะแสดงรายการแพ็กเกจที่ติดตั้งด้วยตนเองทั้งหมดโดยไม่ต้อง: การพึ่งพา, แพ็กเกจที่ถอนการติดตั้ง, แพ็คเกจที่ติดตั้งระหว่างการติดตั้งระบบ

unopts() {
  in=`cat`
  echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}

list() {
  cat '/var/log/apt/history.log' |
  grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
  egrep --color=never "Commandline: apt-get.* $1" |
  sed -r "s/Commandline: apt-get//;s/ $1//" |
  unopts |
  tr ' ' '\n' |
  sed '/^$/d'
}

hapt() {
  tmp=`mktemp -d`
  installed=$tmp/installed
  deleted=$tmp/deleted
  dpkg=$tmp/dpkg
  list 'install' > $installed
  list '(remove|purge|autoremove)' > $deleted
  dpkg --get-selections |
  grep -v 'deinstall' |
  cut -f 1 > $dpkg
  while read package
  do
    sed -i "0,/$package/{//d;}" $installed
  done < $deleted
  while read package
  do
    if [ -z "`grep --color=never "^$package$" $dpkg`" ]
    then
      sed -i "0,/$package/{//d;}" $installed
    fi
  done < $installed
  cat $installed
  rm -r $tmp
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.