ฉันจะรับประวัติของ“ apt-get install” บน Ubuntu ได้อย่างไร?


85

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

มีวิธีง่าย ๆ ในการค้นหาประวัติของคำสั่ง "sudo apt-get install" ที่ฉันให้ไว้ตลอดเวลาหรือไม่? นั่นคือ dpkg -l แสดงแพ็กเกจทั้งหมดที่ติดตั้งไว้ แต่ไม่ใช่แพ็กเกจระดับบนสุดที่ติดตั้งไว้ หากมีวิธีการที่ dpkg จะมอบแพ็คเกจการติดตั้งให้ฉันฉันสามารถค้นหาแพ็คเกจที่ไม่ซ้ำกันได้ มิฉะนั้นฉันต้องการอย่างอื่นที่จะพูดว่า "คุณติดตั้ง 24 แพคเกจเหล่านี้"



คุณยอมรับคำตอบด้านล่างได้ไหม? ที่จะขอบคุณคนที่ตอบ
m-ric


โซลูชันเหล่านี้จะตรวจสอบสิ่งที่เกิดขึ้นหลังจากการหมุนบันทึกล่าสุดเท่านั้น พวกเขาไม่ได้ตรวจสอบประวัติทั้งหมด
Kraang Prime

คำตอบนี้ง่ายและรวดเร็วคือaskubuntu.com/a/250530/197730สำหรับคำถามนี้จะแสดงรายการแพ็คเกจที่ติดตั้งทั้งหมดได้อย่างไร
TooTone

คำตอบ:


68

aptประวัติศาสตร์ใน/var/log/apt/history.logฐานะกล่าวว่าในความคิดเห็นดังกล่าวข้างต้น ที่กล่าวมานี้จะไม่แสดงรายการแพคเกจที่มีการติดตั้งด้วยตนเองโดยใช้dpkgหรือ GUIs gdebiเช่น หากต้องการดูแพคเกจทั้งหมดที่เดินผ่านคุณสามารถดูdpkg/var/log/dpkg.log


8

5
ขั้นตอนในลิงค์แรกไม่แยกความแตกต่างระหว่างแพ็คเกจที่ติดตั้งโดยอัตโนมัติและแพ็คเกจที่ติดตั้งด้วยตนเอง /var/log/apt/history.log(คุณได้ตำแหน่งผิด btw) จะหมุนไปหลังจากไม่กี่เดือน
Gilles

Gilles นั้นถูกต้องทั้งคู่ ฉันมีบันทึกการใช้งานในเดือนนี้เท่านั้นและฉันไม่สามารถดูได้ว่าตั้งค่าอัตราการลบบันทึกได้อย่างไร (ทำได้ด้วย 'newsyslog' ใน FreeBSD) ดังนั้นฉันยังไม่มีวิธีแก้ปัญหา แต่ฉันมีตัวชี้บางอย่าง อย่างน้อยฉันสามารถ grep เอาท์พุทจากคำสั่งในบทความโคลนมองหาชื่อ "ระดับสูง" ติดตั้งพวกเขาในใหม่ทำสิ่งเดียวกันในกล่องใหม่แตกต่างสองผลลัพธ์และทำซ้ำจนกว่าพอใจ ฉันยังคงต้องการฟังแนวคิดเพิ่มเติม
พอลฮอฟแมน

7

apt-markคุณสามารถแสดงรายการแพคเกจที่มีการติดตั้งได้รับการร้องขออย่างชัดเจนด้วย

apt-mark showmanual

ในกรณีที่คุณใช้งานเดเบียนในรุ่นเก่านี่คือวิธีใช้แบบแมนนวล

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

dpkg --get-selections | sed -n 's/\t\+install$//p'

คำสั่งต่อไปนี้ให้ชุดของแพ็คเกจที่ติดตั้งโดยอัตโนมัติ:

</var/lib/apt/extended_states awk -v RS= '/\nAuto-Installed: *1/{print$2}'

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

comm -23 <(dpkg --get-selections | sed -n 's/\t\+install$//p') \
         <(</var/lib/apt/extended_states \
           awk -v RS= '/\nAuto-Installed: *1/{print$2}' |sort)

1
--- ผลลัพธ์ที่แตกต่างกันมากจากcomm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
Cbhihe

บน Debian มีapt-mark showmanualคำสั่งใดเทียบเท่ากับคำสั่งสุดท้ายของคุณ
maxschlepzig

3
grep -i "Commandline" /var/log/apt/history.log

แสดงแพ็คเกจทั้งหมดที่คุณติดตั้งโดยใช้: sudo apt-get install xxxxx


สิ่งนี้ไม่แตกต่างจากคำตอบของ @ ℝaphinkอย่างเพียงพอและควรมีความคิดเห็น
Karl Richter

2

แทนที่จะใช้การรวมกันของแทค / เฮดจะดีกว่าถ้าใช้ tail (สำหรับ 25 บรรทัดสุดท้าย):

tail -n 25 /var/log/apt/history.log

สิ่งนี้ไม่แตกต่างจากคำตอบของ @ ℝaphinkอย่างเพียงพอและควรมีความคิดเห็น
Karl Richter

นอกจากนี้ยังไม่เหมือนกัน tail จะแสดงรายการบรรทัดสุดท้ายในไฟล์ตามลำดับที่อยู่ในไฟล์ แทคจะกลับคำสั่งซื้อเพื่อให้บรรทัดสุดท้ายเป็นครั้งแรกครั้งที่สองถึงครั้งสุดท้ายเป็นครั้งที่สอง ฯลฯ อีกครั้งดูเหมือนว่าคุณมีความเสี่ยงที่จะผิดเมื่อคุณพูดบางสิ่งที่ "ดีกว่า" โดยไม่อธิบายว่าทำไม ฉันหมายถึง "ดีกว่า" ตามใคร สำหรับความต้องการอะไร ดูเหมือนว่าค่อนข้างมั่นใจ
ทอดด์วอลตัน

0

คำตอบอื่น ๆ ช่วย แต่ให้ผลลัพธ์มากเกินไป เพื่อลดการส่งออกที่ผมเริ่มต้นด้วยapt-mark showmanualเช่นเดียวกับในคำตอบนี้และจากนั้นกรองออกแพคเกจติดตั้งครั้งแรก (ดูคำตอบนี้สำหรับวิธีการที่จะได้รับรายชื่อของแพคเกจติดตั้งเดิม; ฉันใช้อูบุนตู 18.04.2 ด้วยเหตุนี้การเชื่อมโยงด้านล่าง) .

BASE_PACKAGES_MANIFEST=http://releases.ubuntu.com/18.04.2/ubuntu-18.04.2-desktop-amd64.manifest
REMOVE_VERSIONS_REGEX='[0-9][.-][0-9][.-][0-9]|[0-9][.-][0-9]|[0-9]'
paste  <( apt-mark showmanual ) <( apt-mark showmanual | sed -r "s/$REMOVE_VERSIONS_REGEX//g" ) |
    grep -vf <( curl $BASE_PACKAGES_MANIFEST | cut -f1 | sed -r "s/$REMOVE_VERSIONS_REGEX|:amd//g" ) |
    cut -f1 |
    sort |
    uniq

สคริปต์กรองแพ็กเกจที่อยู่ในรายการต้นฉบับโดยทำการเปรียบเทียบรุ่นที่เป็นอิสระดังนั้นแพ็คเกจที่อัปเกรดจะไม่ปรากฏในรายการ ฉันลงเอยด้วยรายการประมาณ 60 แพ็คเกจ

วิธีที่ฉันชอบคือคำตอบนี้ที่ค้นหาบันทึก aptทั้งหมด


-1

ในการรับรายการแพ็คเกจล่าสุดที่ติดตั้งตามลำดับจากมากไปน้อยฉันชอบใช้ (เช่น 25 บรรทัด):

tac /var/log/apt/history.log |head --lines=25

1
มีประสิทธิภาพมากขึ้น (และเรียงตามลำดับ) จะเป็น: tail -25 /var/log/apt/history.log | tac
agc

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