จะดูแพ็คเกจที่ติดตั้งในวันที่กำหนดโดยใช้ 'aptitude' ได้อย่างไร


54

ไม่มีใครรู้ว่ามีวิธีที่ง่ายในการค้นหารายการแพคเกจที่ติดตั้งเรียงตามวันที่เมื่อใช้aptitude(หรือapt-get)?

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

ฉันพยายามลองดูรายการของไฟล์. deb ที่ดาวน์โหลดมา แต่ดูเหมือนว่าจะเป็นวิธีที่ค่อนข้างล้าหลัง (แม้ว่ามันจะใช้งานได้)

คำตอบ:


43

น่าเสียดายที่ dpkg (ความถนัดของตัวจัดการบรรจุภัณฑ์ทำงานได้ดี) ไม่ได้บันทึกวันที่ติดตั้งแพคเกจโดยเฉพาะแม้ว่าจะมีความคิดที่จะเพิ่มมัน /var/lib/dpkg/infoแต่วันที่ติดตั้งสามารถพบได้โดยดูที่ประทับวันที่ของไฟล์ที่เป็นลายลักษณ์อักษรไปยังไดเรกทอรี


4
หากคุณใช้วิธีการนี้ตรวจสอบให้แน่ใจว่าได้ตรวจสอบการประทับเวลาของ*.listไฟล์เท่านั้นเนื่องจากไฟล์อื่นถูกประทับตราด้วยวันที่ของแพคเกจ
เดฟ

20

ฉันได้กำหนดค่าความสามารถในการเขียนลงในบันทึก ( /var/log/aptitude) มันสร้างผลลัพธ์เช่นนี้

Aptitude 0.4.11.11: log report
Mon, Feb  9 2009 13:21:28 +0100

IMPORTANT: this log only lists intended actions; actions which fail due to
dpkg problems may not be completed.

Will install 6 packages, and remove 0 packages.
4096B of disk space will be used
===============================================================================
[UPGRADE] apt 0.7.20.1 -> 0.7.20.2
[UPGRADE] apt-utils 0.7.20.1 -> 0.7.20.2
[UPGRADE] base-passwd 3.5.19 -> 3.5.20
[UPGRADE] libgnutls26 2.4.2-5 -> 2.4.2-6
[UPGRADE] libpq5 8.3.5-1 -> 8.3.6-1
[UPGRADE] ucf 3.0015 -> 3.0016
===============================================================================

Log complete.

สิ่งนี้แสดงวันที่และแพคเกจที่ถูกต้องที่ติดตั้ง หากต้องการกำหนดค่านี้ให้ทำตามการอ้างอิงความถนัด

Option:Aptitude::Log

Default:/var/log/aptitude

Description: If this is set to a nonempty string, aptitude will log the package
installations, removals, and upgrades that it performs. If the value of
Aptitude::Log begins with a pipe character (ie, ``|''), the remainder of its
value is used as the name of a command into which the log will be piped: for
instance, |mail -s 'Aptitude install run' root will cause the log to be emailed
to root. To log to multiple files or commands, you may set this option to a list
of log targets.

คุณจะพบลิงค์ไปยังการอ้างอิงความถนัดในหน้า man aptitude


1
กรุณาโพสต์ลิงค์และวิธีการใช้งาน เพียงอ้างถึงข้อความคู่มือบางอย่างไม่เป็นประโยชน์
not2qubit

17

มีวิธีง่ายๆในการดูวันที่ติดตั้งแพ็คเกจทั้งหมด เพิ่งดำเนินการ:

grep " install" /var/log/dpkg.log*

ดังนั้นคุณจะได้รับรายชื่อของแพ็คเกจที่ติดตั้งทั้งหมดพร้อมวันและเวลาที่แน่นอน

ขอบคุณสำหรับความคิดเห็นที่นำฉันไปสู่โซลูชันนั้น


2
cdคำสั่งไม่จำเป็นถ้าคุณใช้เส้นทางที่เต็มรูปแบบในcatคำสั่ง ...
papukaija

1
วัตถุประสงค์ของcdคำสั่งคือการlsเข้าไปในไดเรกทอรีนี้เพื่อตรวจสอบไฟล์ dpkg.log ที่มีอยู่ แต่การแก้ปัญหาที่ดีกว่าจะทำงานls /var/log | grep 'dpkg.log'เพื่อแสดงรายการไฟล์บันทึก ขออภัยในความยุ่งเหยิง
jmarceli

2
หรือเพียงแค่ "grep install /var/log/dpkg.log*"
Marc Van Daele

1
อืมฉันไม่รู้ว่าcat | catเป็นสิ่งที่คุณสามารถทำได้ แต่ทำไมไม่ให้ cat ทั้งสองไฟล์ในคำสั่งเดียว? (หรือดียิ่งขึ้น: เพียงทำสิ่งที่ @MarcVanDaele พูด)
mwfearnley

13

ฉันพบอันนี้ที่นี่บนเว็บ มันสร้างประวัติของ dpkg จากไฟล์บันทึกของ dpkg

มันดูง่ายมาก

function apt-history(){
      case "$1" in
        install)
              cat /var/log/dpkg.log | grep 'install '
              ;;
        upgrade|remove)
              cat /var/log/dpkg.log | grep $1
              ;;
        rollback)
              cat /var/log/dpkg.log | grep upgrade | \
                  grep "$2" -A10000000 | \
                  grep "$3" -B10000000 | \
                  awk '{print $4"="$5}'
              ;;
        *)
              cat /var/log/dpkg.log
              ;;
      esac
}

แหล่ง

แก้ไข

ฉันลองใช้สคริปต์นี้บน Ubuntu 8.10 Server และทำงานได้ดีมาก คุณช่วยให้ข้อมูลบางอย่างวิธีแก้ปัญหาของคุณ?


5
  • ใช้บันทึก dpkg

    locate dpkg.log | xargs cat {} | grep " install "
    
  • หรือถ้าคุณไม่มี locate

    find /var/log/ -name 'dpkg.log' | xargs cat {} | grep " install "
    
  • ใช้sortเพื่อให้แน่ใจว่าการสั่งซื้อตามเวลาที่เหมาะสม

    locate dpkg.log | xargs cat {} | grep " install " | sort
    
  • ใช้tac(ย้อนกลับcat) *, หัวหน้าเช่นเพื่อรับ 4 รายการล่าสุด

    locate dpkg.log | xargs cat {} | grep " install " | sort | tac | head -n4
    

เช่นสำหรับคำสั่งสุดท้ายฉันจะได้รับ:

2014-10-08 18:56:12 install xorg-server-source:all <none> 2:1.16.1-1
2014-10-08 18:49:34 install libelementary-data:all <none> 0.7.0.55225-1
2014-10-08 18:46:57 install e17:i386 <none> 0.17.6-1
2014-10-08 18:46:56 install libedje-bin:i386 <none> 1.8.6-2.1+b1

1
ทำไมคุณจะใช้tac+ headแทนtail?
Zanna

1
ฉันลืมไปแล้วว่าทำไม - แต่เป็นไปได้ว่ามันมีเหตุผลที่ดีทั้งหมดสำหรับมัน .. หรือบางทีฉันก็มีช่วงเวลาบลอนด์: D
a20

4

นอกจากนี้คุณยังสามารถติดตามการกระทำก่อนหน้าของคุณโดยตรวจสอบ /var/log/apt/term.log และไฟล์ที่เก่ากว่า term.log.1.gz เป็นต้น) มีการประทับเวลาและบันทึกที่สมบูรณ์จากข้อความระหว่างการติดตั้ง


2

[การตอบคำถามจริง] ใช่มีวิธีง่าย ๆ ในการค้นหาแพ็คเกจที่ติดตั้งในวันที่กำหนดแม้ว่ามันจะทำภายในเทอร์มินัลโดยใช้ apt-get

หากคุณติดตั้ง Synaptic Package Manager ซึ่งสามารถติดตั้งได้อย่างอิสระจาก Ubuntu Software Center คุณต้องเปิดเมนูไฟล์และเลือกตัวเลือก "ประวัติ" เท่านั้น ที่นั่นคุณจะพบบัญชีของแพ็คเกจแอปพลิเคชั่นที่เพิ่มและลบทั้งหมดซึ่งจัดเรียงตามวันที่ไม่ว่าจะติดตั้งหรือนำออกมาอย่างไร


2

มีpkginstall.shสคริปต์'ทางการ' ที่สามารถทำได้ ทำตามคำแนะนำในเอกสารอย่างเป็นทางการ ดาวน์โหลดสคริปต์จากลิงค์ด้านบนสั้น ๆ ตรวจสอบให้แน่ใจว่าสามารถเรียกใช้งานได้จากนั้นเรียกใช้ด้วย:

~/pkginstalls.sh

สิ่งนี้จะสร้างpkginstalls.txtไฟล์ในโฮมไดเร็กตอรี่ของคุณที่มีแพ็คเกจที่ติดตั้งทั้งหมดเรียงตามวันที่

BTW นี่คือเนื้อหาของสคริปต์:

#!/bin/bash
#pkginstalls.sh
#creates text file with a list of all packages installed by date

#first append all info from archived logs

i=2
mycount=$(ls -l /var/log/dpkg.log.*.gz | wc -l)
nlogs=$(( $mycount + 1 ))

while [ $i -le $nlogs ]
do
if [ -e /var/log/dpkg.log.$i.gz ]; then
zcat /var/log/dpkg.log.$i.gz | grep "\ install\ " >> $HOME/pkgtmp.txt
fi
i=$(( $i+1 ))

done

#next append all info from unarchived logs

i=1
nulogs=$(ls -l /var/log/dpkg.log.* | wc -l)
nulogs=$(( $nulogs - $nlogs + 1 ))
while [ $i -le $nulogs ]
do
if [ -e /var/log/dpkg.log.$i ]; then
cat /var/log/dpkg.log.$i | grep "\ install\ " >> $HOME/pkgtmp.txt
fi
i=$(( $i+1 ))

done

#next append current log

cat /var/log/dpkg.log | grep "\ install\ " >> $HOME/pkgtmp.txt

#sort text file by date

sort -n $HOME/pkgtmp.txt > $HOME/pkginstalls.txt

rm $HOME/pkgtmp.txt

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