รายการแพคเกจที่ติดตั้งอย่างชัดเจน


53

ใน Gentoo มีไฟล์/var/lib/portage/worldที่มีแพ็คเกจที่ฉันติดตั้งไว้อย่างชัดเจน โดยชัดแจ้งฉันหมายถึงแพ็คเกจที่ฉันเลือกไม่รวมสิ่งที่ติดตั้งเป็นค่าเริ่มต้นหรือถูกอ้างอิงโดยการอ้างอิง

มีไฟล์ที่คล้ายกันหรือคำสั่งเพื่อค้นหาข้อมูลใน Ubuntu หรือไม่?

คำตอบ:


46

เพียงแค่รหัส

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
  | cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

คำอธิบาย

วิธีหนึ่งที่จะคิดเกี่ยวกับปัญหานี้คือการแบ่งสิ่งนี้ออกเป็นสามส่วน:

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

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

ดูเหมือนว่าคำสั่งต่อไปนี้จะทำงานบนระบบของฉัน:

$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt

วิธีการที่คล้ายกันสามารถพบได้ในลิงค์ที่ Gilles โพสต์เป็นความคิดเห็นคำถาม บางแหล่งอ้างว่ามันใช้งานได้เฉพาะเมื่อคุณใช้ความสามารถในการติดตั้งแพ็คเกจเท่านั้น อย่างไรก็ตามฉันแทบไม่เคยใช้ความสามารถในการติดตั้งแพ็คเกจและพบว่ายังใช้งานได้ การ--disable-columnsป้องกันความถนัดจากการขยายของชื่อแพ็กเกจด้วยช่องว่างที่จะขัดขวางการเปรียบเทียบด้านล่าง | sort -uประเภทไฟล์และลบที่ซ้ำกัน ทำให้ขั้นตอนสุดท้ายง่ายขึ้นมาก

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

หมายเหตุ:ส่วนนี้เริ่มต้นด้วย 'เส้นทางที่ผิด' ที่ฉันคิดว่าเป็นตัวอย่าง รหัสชิ้นที่สองคือรหัสที่ใช้งานได้

นี่มันช่างค่อนข้างหลอกลวง ฉันเริ่มคิดว่าการประมาณที่ดีจะเป็นแพ็คเกจทั้งหมดที่ขึ้นอยู่กับ meta-packages ubuntu-minimal, ubuntu-standard, ubuntu-desktop, และ linux kernel ที่เกี่ยวข้องกับแพ็คเกจต่างๆ ผลลัพธ์เล็กน้อยในการค้นหาของ Google ดูเหมือนจะใช้วิธีนี้ ในการรับรายการการขึ้นต่อกันเหล่านี้ฉันลองทำสิ่งต่อไปนี้ก่อน (ซึ่งไม่ได้ผล):

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

ดูเหมือนว่าจะไม่ใช้แพ็คเกจที่ฉันรู้ว่าต้องมาตามค่าเริ่มต้น ฉันยังเชื่อว่าวิธีนี้ควรใช้งานได้หากมีการสร้างรายการ metapackages ที่ถูกต้อง

อย่างไรก็ตามดูเหมือนว่ามิร์เรอร์ของ Ubuntu จะมีไฟล์ "manifest" ที่มีแพ็คเกจทั้งหมดในการติดตั้งเริ่มต้น รายการสำหรับ Ubuntu 12.04.3 อยู่ที่นี่:

http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest

หากคุณค้นหาผ่านหน้านี้ (หรือหน้ากระจกใกล้กับคุณ):

http://mirror.pnl.gov/releases/precise/

คุณควรจะสามารถค้นหาไฟล์ ".manifest" ที่สอดคล้องกับรุ่นและสถาปัตยกรรมที่คุณใช้ เพื่อแยกชื่อแพคเกจฉันทำสิ่งนี้:

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt

รายการน่าจะเรียงแล้วและไม่ซ้ำกัน แต่ฉันต้องการให้แน่ใจว่าเรียงลำดับอย่างถูกต้องเพื่อทำให้ขั้นตอนต่อไปง่ายขึ้น defaultinstalled.txtจากนั้นผมก็ใส่เอาท์พุทใน

ฉันจะรับความแตกต่างระหว่างสองรายการนี้ได้อย่างไร

นี่เป็นส่วนที่ง่ายที่สุดเนื่องจากระบบที่เหมือน Unix ส่วนใหญ่มีเครื่องมือมากมายในการทำเช่นนี้ commเครื่องมือที่เป็นหนึ่งในหลายวิธีที่จะทำเช่นนี้:

comm -23 currentlyinstalled.txt defaultinstalled.txt

นี่ควรพิมพ์รายการของบรรทัดที่ไม่ซ้ำกับไฟล์แรก ดังนั้นจึงควรพิมพ์รายการแพคเกจที่ติดตั้งไม่ได้อยู่ในการติดตั้งเริ่มต้น


ไปป์ไลน์แรกของคุณทำอะไรaptitude search '~i!~M' -F %pไม่ได้?
ephemient

@ephemient: คงไม่มีอะไร ฉันไม่ค่อยรู้เรื่องความถนัดและใช้เครื่องมือที่ฉันคุ้นเคยมากกว่าที่จะขุดในไฟล์ man ของโปรแกรมที่ฉันไม่เคยใช้
Steven D

1
คุณทำลายความหวังของฉันฉันคิดว่ามีวิธีง่าย ๆ ที่เป็นมาตรฐาน: (
phunehehe

3
เกือบจะใช้งานได้ แต่ก็ยังไม่ถูกต้อง มีหลายแพ็คเกจและไลบรารีที่ฉันไม่ได้ติดตั้งด้วยตนเองอย่างแน่นอนมีอยู่ในรายการผลลัพธ์ ฉันใช้http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifestและเพิ่มเติม| sed "s/ *$//"แต่ก็ยังไม่มีลูกเต๋า
jmiserez

1
ขั้นตอนแรกที่ได้รับรายการแพคเกจที่ไม่ได้ติดตั้งเป็นการอ้างอิงสามารถถูกแทนที่ด้วยapt-mark showmanual | sort -uดังแสดงในคำตอบอื่น ๆ เรียบง่ายและไม่พึ่งพาaptitudeซึ่งไม่ได้ติดตั้งไว้ตามค่าเริ่มต้น
skagedal

24

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

การใช้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 นอกจากนี้เวอร์ชันลินุกซ์ส่วนหัวก็ดูเหมือนจะสะสมแม้ว่าฉันจะติดตั้ง 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

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


หากคุณได้อัพเกรดระบบของคุณตั้งแต่การติดตั้งครั้งแรก (ซึ่งเป็นกรณีสำหรับคนส่วนใหญ่ที่ฉันคิดว่า) ควรใช้ไฟล์ Manifest ของ Ubuntu เวอร์ชันปัจจุบันของคุณ
Diego V

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

ฉันประทับใจ! ฉันพบชิ้นส่วนที่ขาดไป สิ่งที่เกี่ยวกับแพคเกจที่ติดตั้งครั้งแรกแต่จากนั้นออกด้วยตนเองอย่างชัดเจนอย่างไรก็ตามในภายหลังติดตั้งใหม่ด้วยตนเองอย่างชัดเจน? ฉันพบสิ่งนี้ในระบบที่ใช้งานได้
n611x007

1
ฉันได้ตั้งคำถามunix.SE/225330: ทำรายการแพ็กเกจที่ลบอย่างชัดเจน (apt)เพื่อจัดการกับงานจำนวนมาก
n611x007

1
นี่เป็นวิธีที่ดีกว่าโซลูชันที่ได้รับการยอมรับเนื่องจากmirror.pnl.gov/releases/precise/… URL ในโซลูชันที่ยอมรับตอนนี้คือ 404
rmunn

9

ตามman apt-mark:

apt-mark showauto
apt-mark showmanual

2
showmanualกำลังแสดงสิ่งต่าง ๆ เช่นxserver-xorg-video-vesaซึ่งฉันสาบานว่าฉันไม่ได้ติดตั้งด้วยตนเอง
phunehehe

อาจติดตั้งโดยอัตโนมัติโดย distro ของคุณในการติดตั้งครั้งแรก
แมตต์

8

นี่คือตัวอย่างผลลัพธ์ของcat /var/log/apt/history.log:

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

สำหรับคำถามของคุณให้กรองข้อมูลด้วย grep ( cat /var/log/apt/history.log | grep Commandline)

โปรดทราบว่าไฟล์เหล่านี้หมุนได้ดังนั้นโปรดตรวจสอบไฟล์อื่น ๆ เพื่อไม่ให้คุณพลาดอะไร:

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

หมายเหตุ :

  • ฉันได้ตรวจสอบทั้งความถนัดและsynaptic (รุ่น0.70และ0.6.3ตามลำดับ) และพวกเขาทั้งคู่เข้าสู่กิจกรรมของพวกเขาในไฟล์บันทึกนั้น ความปราชัยหนึ่งเดียวกับพวกเขาคือพวกเขาไม่มีบรรทัดเริ่มต้นด้วยCommandlineดังนั้นgrepเคล็ดลับจะไม่ทำงานกับพวกเขา

2
ทางออกที่น่าสนใจ คุณจะต้องปรับคำสั่ง grep เล็กน้อยเพื่อรับรายการแพ็คเกจและบัญชีสำหรับแพ็คเกจที่ติดตั้งโดยaptitudeและผู้จัดการแพ็คเกจอื่น ๆ หากบันทึกของคุณหมุนไปแล้วคุณก็จะโชคไม่ดี
Steven D

ปรับปรุงแล้ว @steven grep-fu ของฉันเป็นสามเณรดังนั้นฉันจะปล่อยให้ผู้อ่าน นอกจากนี้ฉันไม่ทราบว่าสิ่งที่หมุนออกไป ฉันต้องทำไฟล์เอง
tshepang

ไม่ว่าพวกเขาจะหมุนไปไหนจะขึ้นอยู่กับการตั้งค่า logrotate ของคุณและระยะเวลาที่ระบบของคุณใช้งาน ฉันไม่แน่ใจเกี่ยวกับค่าเริ่มต้นของ Ubuntu เนื่องจากเป็นเวลานานนับตั้งแต่ที่ฉันเปลี่ยนพวกเขา
Steven D

7

ฉันเจอผู้เผยแพร่รายนี้ที่สวยงามในขณะที่กำลังค้นหาข้อความค้นหานี้

ซับเดียวคือ

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )`

oneliner นี้กรองแพ็กเกจที่ติดตั้งโดยระบบโดยใช้บันทึกจาก /var/log/installer/initial-status.gz

ฉันจะโพสต์ลิงก์ไปยังเธรดเดิมเมื่อฉันพบมันเนื่องจากผู้เผยแพร่รายนี้ไม่ใช่ของฉันและฉันไม่สามารถจำตำแหน่งที่ฉันเห็นได้


3

คุณต้องการที่จะมีลักษณะที่เกี่ยวข้องในบทความนี้

ในตอนท้ายของบทความมีสคริปต์ python ที่ควรทำในสิ่งที่คุณต้องการ

มันถูกเขียนขึ้นสำหรับ(k) อูบุนตู แต่ควรทำงานกับUbuntuเช่นกัน


3
ดูเหมือนว่าลิงก์จะไม่ทำงานอีกต่อไป
rog

2
ลิงก์ที่ใช้งานไม่ได้นี่คือเหตุผลที่การรวมข้อมูลที่เกี่ยวข้องไว้ในคำตอบ
whitehat101

2

ด้านล่างนี้คือนอกเหนือจากคำตอบของสตีเว่น D's

บรรทัดต่อไปนี้ดูเหมือนจะตัดทอนชื่อแพ็คเกจที่ 32 อักขระ:

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

ดูเหมือนว่าจะใช้งานได้:

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

ดูคำตอบนี้


1

เช็คเอาท์ /var/log/apt/term.log


2
นั่นเป็นวิธีที่ค่อนข้างเจ็บปวดในการทำสิ่งต่าง ๆ และไม่มีความแตกต่างระหว่างแพ็คเกจที่ฉันติดตั้งด้วยตัวเองและสิ่งเหล่านั้นได้มาจากการพึ่งพา
phunehehe

ฉันเห็นด้วย แต่ฉันไม่ทราบว่า apt คอยติดตามสิ่งเหล่านี้: / ตอนนี้ฉันรู้แล้วขอบคุณ Stefan :)
Joril

1

/var/lib/apt/extended_statesนอกจากนี้คุณยังอาจดูไฟล์

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

สิ่งนี้มีประโยชน์หากคุณต้องการทราบว่าติดตั้งอะไรในพาร์ติชั่นเก่า


0

ขอบคุณมากและขอแสดงความยินดีกับผู้ที่ได้รับอัญมณีแห่งสคริปต์ !!!
ฉันต้องการเพิ่ม 2 ¢ของฉันและฉันติดวันที่ติดตั้งที่ฉันอนุมานจาก $ info
ฉันไม่เข้าใจรายละเอียดว่าเหตุใดไฟล์ $ info จึงถูกอัปเดตหรือไม่และเมื่อใด แต่ใช้งานได้จริง
สคริปต์ของฉันแสดงรายการอัปเดตล่าสุดของแพคเกจไม่ขึ้นต่อกันที่เพิ่มหลังจากการติดตั้ง
ให้มันตรวจสอบเป็นระยะฉันเห็นสิ่งที่ฉันจะเข้าสู่ระบบด้วยตนเองโดยไม่พลาดเดียว
นั่นคือชุดของแพ็กเก็ตที่ติดตั้งด้วยเหตุผลเดียวกัน น่าเสียดายที่การอัปเดตทำให้คำสั่งนั้นหยุดชะงัก
หลังจากอัปเกรดระบบฉันมีรายการแพ็กเกจที่เพิ่มซึ่งการอัปเกรดไม่ได้อัปเดตตามด้วยแพ็กเกจที่ทำ
เรียบร้อย! สนุก.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.