ค้นหาแพ็คเกจที่ผู้ใช้ติดตั้งทั้งหมด


38

มีวิธีใดบ้างที่จะรับรายการแพ็คเกจทั้งหมดที่ผู้ใช้ติดตั้งบนระบบ Ubuntu เช่นแพ็คเกจที่ติดตั้งไว้ด้านบนของแพ็คเกจเริ่มต้นที่ติดตั้งไว้หรือไม่

(ความคิดคือการได้รับรายการที่ครอบคลุมที่สามารถใช้ในการติดตั้งแพคเกจเดียวกันในการติดตั้ง Ubuntu สะอาด)

คำตอบ:


15

ดูไฟล์เหล่านี้

  1. ' /var/log/installer/initial-status.gz' - การติดตั้งหลักของคุณ
    • วันที่ไฟล์นี้จะเป็นวันที่ติดตั้งของคุณ (ฉันคิดว่า)
    • ' /var/log/dpkg.log' ระยะเวลาการปรับปรุง (นี้คือสิ่งที่คุณต้องการ)
    • ' /var/log/apt/term.log' - สิ่งต่าง ๆ ได้aptรับการปรับปรุงในระบบของคุณ
    • ' /var/cache/apt/archives/'จะมีdebแพ็คเกจที่ดาวน์โหลดมาเพื่อติดตั้ง

อัปเดต: ใช้สองขั้นตอนต่อไปนี้สำหรับรายการการติดตั้งใหม่ที่แน่นอน:

  1. ดำเนินการ: grep -w install /var/log/dpkg.log > full-list.log
  2. ดูบรรทัดเกิน/var/log/installer/initial-status.gzเวลาประทับ

เนื่องจากคุณต้องการติดตั้งใหม่ทั้งหมดในระบบอื่นด้วยแพ็คเกจเหล่านี้คุณสามารถคัดลอกไฟล์ 'deb' จากเส้นทาง 'cache / apt / archives' ไปยังการติดตั้งใหม่และติดตั้งในภาพเดียว (โดยไม่ต้องดาวน์โหลด พวกเขาอีกครั้ง)


ขอบคุณสำหรับทิป. มันมีประโยชน์แม้ว่าฉันจะหาคำสั่งเดียวมากกว่านี้เพื่อรับรายการนี้ cat /var/log/dpkg.log | grep 'ติดตั้ง' ดูเหมือนว่าจะมาใกล้ชิดหากฉันไม่สนใจรายการที่ติดตั้งได้ถึงวันที่ติดตั้งที่ / เวลา
Rabarberski

การเพิ่มเหตุผลในการลงคะแนนเสียงจะช่วยให้เข้าใจปัญหาในคำตอบหากมี จะนำไปสู่คำตอบที่ดีกว่าในอนาคต
nik

Oeps downvote เป็นของฉันโดยไม่ตั้งใจ ฉันได้ตอบคำถามของคุณแล้ว เมื่อฉันพยายามที่จะทำเครื่องหมายคำตอบของคุณเป็น 'ขั้นสุดท้าย' ฉันพลาดและกดลูกศรลงคะแนน พยายามที่จะเลิกทำมันแสดงข้อความ: "โหวตเก่าเกินไปที่จะเปลี่ยนแปลงเว้นแต่คำตอบนี้จะแก้ไข" ขออภัย nik ทั้งสำหรับ downvote และความสับสน :-(
Rabarberski

@ Rabarberski ดีที่เกิดขึ้น ... ไม่ทำอันตราย
nik

ไม่ทำงานหาก / var / log / installer ไม่มีอยู่เช่นเดียวกับการติดตั้งเซิร์ฟเวอร์ นอกจากนี้คุณควรเพิ่มหมายเลขรุ่นหากคุณกำลังพูดถึง "Ubuntu" - Ubuntu รุ่นใด

8

สำหรับรอยยิ้มฉันได้รวบรวมหนึ่งซับ (ที่นี่แยกเพื่อความชัดเจน) ที่คิดออกแพคเกจติดตั้งด้วยตนเองไม่รวมที่ติดตั้งครั้งแรกและแพคเกจใด ๆ ที่ติดตั้งโดยอัตโนมัติ:

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) \
  )

นี้ทำงานได้ทั้งในและbashzsh


มันทำงานได้อย่างสมบูรณ์แบบยกเว้นว่าดูเหมือนว่าจะพิมพ์ไลบรารีจำนวนมากที่ติดตั้งระหว่างการติดตั้งครั้งแรก มีพวงของเรื่องlibtiff, libxcbฯลฯ ซึ่งผมไม่ได้ติดตั้งตัวเอง คำตอบนี้: superuser.com/a/105000/24349ดูแลโดยการเรียงลำดับตามเวลาการติดตั้งและลบทุกอย่างก่อนเวลาติดตั้งระบบ ยอดเยี่ยม (ab) ใช้เปลือก!
haxney

3

จากข้อมูลข้างต้นฉันเขียนสคริปต์ Python สั้น ๆ เพื่อแสดงรายการแพ็คเกจที่ติดตั้งด้วยตนเอง ดูลิงค์นี้

อย่าลังเลที่จะใช้มันแม้ว่าฉันจะไม่รับผิดชอบมัน อย่างไรก็ตามข้อเสนอแนะและข้อเสนอแนะยินดีต้อนรับเสมอ


ยอดเยี่ยม! ใช้เวลาสักครู่ในการรัน แต่มันเป็นทางออกเดียวที่ฉันพบซึ่งทำในสิ่งที่ฉันต้องการ!
haxney

2
น่าเสียดายที่ตอนนี้ลิงก์เสีย (แสดง python traceback) ซึ่งแสดงให้เห็นถึงคุณค่าของการตอบคำถามที่นี่ (โดยเฉพาะอย่างยิ่งสำหรับ "สคริปต์ไพ ธ อนสั้น"
David Ljung Madison Stellar

พบ repo github พร้อมสคริปต์: github.com/gerjantd/bin/blob/master/ ...... คลิกที่ 'raw' เพื่อดาวน์โหลดและเรียกใช้ด้วย 'python list_manually_installed_packages.py'
David Ljung Madison Stellar

2
ลิงก์ github ก็ใช้งานไม่ได้เช่นกัน ...
Suzana

2

ตรวจสอบคำตอบของฉันที่นี่สำหรับคำถามที่เกี่ยวข้อง: ฉันจะแสดงรายการของแพ็คเกจทั้งหมดที่ติดตั้งในระบบ Debian ของฉันได้อย่างไร . คำตอบอื่น ๆ ของคำถามประกอบด้วยคำแนะนำที่ดีในการรับรายการดังกล่าว

คำถามนี้ควรถูกทำเครื่องหมายซ้ำเนื่องจากคำถามก่อนหน้านี้ครอบคลุมคำถามนี้ด้วยเช่นกัน แต่อาจมีประโยชน์หากมีคำถามนี้อยู่ด้วยตนเองเพื่อให้ง่ายต่อการค้นหา


1

สมมติว่าคุณมีประวัติที่สอดคล้องและใช้ความถนัด:

history | grep -e "^..... aptitude install"

จะแสดงเฉพาะแพ็คเกจที่คุณติดตั้งด้วย aptitude install ... duh


1

นี่เป็นงานแฮ็ค แต่ใช้ได้ดี

ก่อนอื่นให้ไปที่http://releases.ubuntu.com/maverick/ (หรือ Ubuntu รุ่นใดก็ได้ที่คุณใช้) และคว้าส่วน*.manifest fileที่เกี่ยวข้องกับรุ่นของ Ubuntu ที่คุณใช้อยู่

จากนั้นรันสคริปต์ต่อไปนี้ (แทนที่<manifest file>วงเล็บมุมและทั้งหมดด้วยพา ธ ไปยังไฟล์ที่คุณดาวน์โหลดคุณสามารถผนวก> outputท้ายเพื่อทำการดัมพ์ไฟล์ได้ตลอดเวลา

diff --suppress-common-lines <(sed 's/ .*//' <manifest file>) <(dpkg --get-selections | sed 's/[ \t].*//') | grep '>' | sed 's/[>] //'

1

ขอบคุณ geekosaur รหัสที่ดี ฉันใช้มัน แต่ใช้เวลาสักครู่กว่าจะหาวิธีทำให้มันใช้งานได้ นี่คือวิธีที่ฉันทำใน Ubuntu 11.10— ทำงานได้ใน bash terminal:

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) \
  ) > user-installed-packages

จากนั้นเพิ่มแท็บ\t- และinstallแต่ละบรรทัด:

sed 's/$/\tinstall/' user-installed-packages >uip

จากนั้นในเครื่องใหม่:

sudo dpkg --set-selections < uip

และเพื่อติดตั้งแพ็คเกจ:

sudo apt-get dselect-upgrade

0

อีกวิธีหนึ่งในการทำเช่นนี้คือการพิจารณาว่ามีการติดตั้งอะไรตาม "งาน" ของคุณซึ่งจะกำหนดแพ็คเกจพื้นฐานที่จะติดตั้งตามความต้องการเริ่มแรกของคุณ

tasksel --list-tasks

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

(tasksel --task-packages server ; \
 tasksel --task-packages openssh-server ; \
 tasksel --task-packages lamp-server) | sort | uniq

วิธีการทั่วไปด้านบนจะเป็น:

(for a in $( tasksel --list-tasks | grep "^i" | awk '{ print $2 }' ) ; \
 do tasksel --task-packages $a; done) | sort | uniq

ตอนนี้ใช้apt-cache depends --installed -i --recurse <packagename> | grep -v "^ "เพื่อรับรายการการขึ้นต่อกันที่ใช้โดยแพ็คเกจทั้งหมดที่กำหนดไว้ในงาน สามารถทำได้ในหนึ่งบรรทัดดังนี้

apt-cache depends --installed -i --recurse \
     $(for a in $( tasksel --list-tasks | \
                   grep "^i" | \
                   awk '{ print $2 }' ) ; \
       do tasksel --task-packages $a; done) | grep -v "^ " | sort | uniq

รายการต่อไปนี้แสดงรายการแพ็กเกจทั้งหมดที่ติดตั้งในระบบของคุณ (ไม่รวมถึงการขึ้นต่อกัน)

dpkg --get-selections | grep "[[:space:]]install" | awk '{print $1}'

ตอนนี้ใช้commคำสั่งเพื่อค้นหาสิ่งที่อยู่ในรายการที่สองเท่านั้น (เช่นไม่สนใจคำสั่งที่อยู่ในไฟล์ทั้งสองและแค่ไฟล์แรก)

comm -13 <(apt-cache depends --installed -i --recurse \
              $(for a in $( tasksel --list-tasks | \
                            grep "^i" | \
                            awk '{ print $2 }' ) ; \
                do tasksel --task-packages $a; done) | grep -v "^ " | sort ) \
         <( dpkg --get-selections | grep "[[:space:]]install" | \
            awk '{print $1}' | sort)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.