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


48

ฉันติดตั้ง Ubuntu 10.10 ธรรมดาบนคอมพิวเตอร์ของฉันและติดตั้งซอฟต์แวร์ผ่าน apt-get สัปดาห์ที่แล้วฉันจัดการเพื่อทำลายทุกอย่างและเพิ่งเริ่มจากศูนย์และฉันต้องติดตั้งซอฟต์แวร์ใหม่ มีวิธีสร้างรายการด้วยแพ็คเกจทั้งหมดที่ฉันติดตั้งด้วยตนเองหรือไม่?

เพื่อที่จะให้ฉันรายการเช่นtexlive, ...และไม่texlive, texlive-dep1, textlive-dep2, ...และแพคเกจมาตรฐานทั้งหมดออก?

ถ้าฉันสามารถหาได้ว่าโปรแกรมใดที่ติดตั้งตามปกติที่ฉันได้ลบออกไปมันก็ยอดเยี่ยมเช่นกัน!


อัปเดต 2015-05-23: ตอนนี้ฉันใช้ Ansible เป็นการจัดการการกำหนดค่าในระบบของฉัน ฉันระบุแพคเกจที่จะติดตั้ง สิ่งนี้ทำหน้าที่ได้ตามเป้าหมายติดตั้งโปรแกรมทั้งหมดในระบบใหม่ให้ดียิ่งขึ้น ดังนั้นคำถามนี้อาจเป็นการเข้าสู่การจัดการการกำหนดค่าแสง

คำตอบ:


24

ด้วยคำแนะนำนี้ฉันสมมติว่าการติดตั้งเก่าของคุณจะยังคงสามารถบู๊ตได้!

ในการทำซ้ำแพ็คเกจหนึ่งชุดบนเครื่องอื่น:

บนระบบ A ให้รัน:

dpkg --get-selections | grep -v deinstall > my-selections

ย้ายmy-selectionsไฟล์ไปที่ System B

บน System B ให้รัน:

dpkg --set-selections < my-selections

แล้ว:

sudo apt-get dselect-upgrade

หมายเหตุสำคัญ: หากคุณติดตั้งแพ็กเกจจากแหล่งเก็บข้อมูลและ / หรือ PPA ที่ไม่ได้มาตรฐานคุณจะต้องคัดลอก/etc/apt/sources.listและเนื้อหา/etc/apt/sources.list.d/จากระบบ A ไปยังระบบ B ก่อนที่จะทำการอัพเกรด

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

dpkg --get-selections | grep deinstall

คุณสามารถดูผลลัพธ์ในเทอร์มินัลหรือแน่นอนเปลี่ยนเส้นทางไปยังไฟล์


9
ฉันต้องการรับรายการแพ็คเกจทั้งหมด แต่ฉันต้องการมีเพียงชื่อแพ็คเกจที่ฉันติดตั้งไว้อย่างชัดเจน ดังนั้นเพียงsomethingและไม่something-commonเช่นกัน
Martin Ueding

6
ใช่แม้ว่ามันจะมีประโยชน์ แต่ก็ไม่ได้ทำในสิ่งที่คำถามถาม
Timmmm

3
หากคุณทำสิ่งนี้การอ้างอิงที่ติดตั้งโดยอัตโนมัติจะไม่ถูกกำจัดเมื่อคุณลบโปรแกรม ทำไมผู้คนถึงโหวตคำตอบที่ผู้ถามถามว่าเขาไม่ต้องการโดยเฉพาะ
jbo5112

20

กระทู้นี้จาก superuser.com ให้วิธีแก้ปัญหานี้:

aptitude search '?installed ?not(?automatic)'

2
มันไม่ได้ผลสำหรับฉัน เพียงแสดงรายการทุกอย่างที่ติดตั้งหรือมากกว่าที่ฉันขอไว้อย่างชัดเจน
Timmmm

มันแสดงรายการทุกสิ่งที่คุณติดตั้งapt-getรวมทั้งการอ้างอิงของพวกเขา ตัวอย่างเช่นถ้าคุณติดตั้งaptitudeแล้วมันก็จะแสดงรายการapt-xapian-index aptitude-common libboost-iostreams1.54.0 libclass-accessor-perl libcwidget3 libept1.4.12 libio-string-perl libparse-debianchangelog-perl libsigc++-2.0-0c2a libsub-name-perl libtimedate-perl libxapian22 python-chardet python-debian python-six python-xapian
Runemoro

10

หากบันทึก apt ของคุณอยู่ใน / var / log / apt สิ่งนี้จะใช้ได้:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install"

หรือถ้าคุณต้องการกำจัดขยะซ้ำ ๆ ในผลลัพธ์:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq

6

คุณสามารถใช้apt-markแต่ฉันแนะนำdebfoster :

sudo apt-get install debfoster
sudo debfoster

วิธีนี้จะตรวจสอบแพ็กเกจที่ติดตั้งไว้ทั้งหมดและดูว่าแพ็กเกจใดที่ติดตั้งอยู่อื่น ๆ :

texlive-full is keeping the following 161 packages installed:
  cm-super cm-super-minimal context doc-base dvipng feynmf
  fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
  ...
Keep texlive-full? [Ynpsiuqx?], [H]elp:

เมื่อคุณตอบ "y" กับคำถามแต่ละข้อ (เพียงกด Enter เพื่อย้ายอย่างรวดเร็ว) debfoster จะรวบรวมรายชื่อแพ็กเกจและเขียนพวกเขาทีละบรรทัดไปยังไฟล์ /var/lib/debfoster/keepersโดยค่าเริ่มต้นนี้อยู่ที่ ดูเหมือนว่านี้:

gnome-do
texlive-full
...

ฉันกำหนดค่า debfoster ผ่าน/etc/debfoster.confเพื่อใส่รายการนี้/etc/debfoster-keepersและติดตามไฟล์ด้วยetckeeperเพื่อเก็บประวัติและสำรองข้อมูล คำตอบที่นี่แสดงให้เห็นถึงวิธีการติดตั้งรายการแพคเกจจากแฟ้มข้อความที่คั่นด้วยการขึ้นบรรทัดใหม่:

sudo apt-mark manual $(cat debfoster-keepers)

โปรดทราบข้อ จำกัด ที่นี่แพ็คเกจที่คุณลบทิ้งจะมีเครื่องหมาย '-' อยู่ข้างหน้า ดังนั้นคุณต้องการลบบรรทัดเหล่านั้นก่อนเรียก apt-mark

แม้ว่าเว็บไซต์ของ debfoster จะบอกว่า debfoster ไม่สนับสนุนความถนัด แต่ฉันชอบ debfoster ที่รวดเร็วและการกำหนดค่าที่ง่าย มันทำให้คุณอยู่ตรงกลางของฐานข้อมูลแพ็คเกจของคุณและช่วยให้คุณล้างสิ่งต่าง ๆ ทำให้แพคเกจอัตโนมัติและคู่มือชัดเจนขึ้น

พิมพ์ "h" ที่พร้อมต์ debfoster เพื่ออธิบายตัวเลือกของคุณ พิมพ์ "?" เพื่อดูคำอธิบายแพ็คเกจ วิธีการที่นี่อาจจะมีประโยชน์


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

ให้แพ็คเกจที่ติดตั้งด้วยตนเองทั้งหมด (ไม่ใช่แพ็คเกจระบบไม่ใช่การขึ้นต่อกัน) สำหรับตัวอย่างมันแสดงให้เห็นแต่ไม่build-essentialgcc


3

สำหรับผู้ที่ต้องการใช้เครื่องมือ apt- * มียูทิลิตี apt-mark ที่อนุญาตให้ทำการสอบถามและแก้ไขสถานะ manual / auto

apt-mark showmanual

คุณสามารถระบุรูปแบบสำหรับแพ็คเกจที่คุณสนใจ:

apt-mark showmanual qemu\*

นี่คือตั๋ว
John Von Neumann

2

ในที่สุดฉันก็รับมันตอนนี้:

outfile="$(mktemp)"
pattern='(\[INSTALLIEREN\]|\[INSTALL\])'

if [[ -f "/var/log/aptitude.1.gz" ]]
then
        gunzip -c /var/log/aptitude.*.gz | grep -E "$pattern" | awk '{ print $2; }' > "$outfile"
fi

if [[ -f "/var/log/aptitude" ]]
then
        grep -E "$pattern" "/var/log/aptitude" | awk '{ print $2; }' >> "$outfile"
fi

sort "$outfile"
rm "$outfile"

2
ฉันเดาว่ามันจะทำงานได้ก็ต่อเมื่อคุณติดตั้งแพ็คเกจโดยใช้ความถนัดเท่านั้น มีไฟล์ที่คล้ายกันใน/var/log/apt/history.log(.N.gz)แม้ว่า
Timmmm

คุณสามารถใช้zgrepแทนgunzipหรือประปาzcat grepมันเป็นสคริปต์ห่อหุ้มที่มาพร้อมกับ gzip ฉันเชื่อ นอกจากนี้ยังรับไฟล์ที่ไม่มีการบีบอัดดังนั้นคุณสามารถทำให้สคริปต์ของคุณง่ายขึ้นzgrep -E '(\[INSTALLIEREN\]|\[INSTALL\])' /var/log/aptitude* | awk '{ print $2 }'
Steve Buzonas

2

ฉันสามารถดึงทุกอย่างได้โดยเปิดไฟล์บันทึกใน / var / log / apt /

จากนั้นฉันก็เข้าไปข้างในแล้วกรองแพ็กเกจติดตั้ง apt-get ด้วยตนเอง อาจมีวิธีการทำสิ่งนี้โดยทางโปรแกรม แต่ฉันไม่ทราบ


1
cd /var/log/apt
cat  history.log | grep Commandline

วิธีนี้คุณจะเห็นรายการคำสั่งที่ดำเนินการในอดีต

ลบรหัส grep หากคุณต้องการข้อมูลเพิ่มเติม:

less history.log

ถ้าบันทึกถูกบีบอัด (เช่นลงท้ายด้วย gz)

gunzip <filename>

เพื่อซิปอีกครั้งเมื่อเสร็จแล้วคุณสามารถทำ:

gzip <filename>

1
แทนที่จะ uncompressing และ recompressing ล็อกไฟล์ทำไมไม่ใช้zcat? zcat filename.gzมันเป็นเรื่องง่ายเหมือน หนึ่งก็สามารถใช้ในการบีบอัดไฟล์ gzip catในสถานที่ของ นอกจากนี้ยังgrepสามารถถูกแทนที่ด้วยเช่นzgrep zgrep Commandline history.log.1.gz
lgarzo

(grep "Commandline" history.log ; zgrep "Commandline" history.log.*.gz ) | grep " install " | grep -v -- "--yes" | sed -r "s/^.*install //"ขึ้นอยู่กับความคิดของคุณฉันได้มากับบรรทัดคำสั่ง: มันมีข้อผิดพลาดเนื่องจากแพ็กเกจที่ถูกลบออกจะถูกแสดงเช่นกันและถ้ามีการติดตั้งแพ็กเกจมากกว่าหนึ่งครั้งมันจะถูกแสดงหลายครั้ง
lgarzo

1

ฉันไม่เห็นวิธีแก้ปัญหาใด ๆ ที่นี่ใช้ได้สำหรับฉันฉันได้ติดตั้งแพ็กเกจ deb จำนวนมากด้วย dpkg และบางรายการที่ฉันกำลังมองหาโดยเฉพาะนั้นขาดหายไป

ซับที่ค่อนข้างยาว แต่สะดวกในการคัดลอกและวาง:

export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > $DPKG_INITIAL ; awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > $DPKG_INSTALLED ; comm -23 installed initial > $DPKG_CUSTOM ; function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; } ; echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > $DPKG_DEPS ; comm -23 custom deps > my-packages ; rm $DPKG_INITIAL $DPKG_INSTALLED $DPKG_CUSTOM $DPKG_DEPS

my-packagesคำสั่งดังกล่าวจะบันทึกรายการของแพคเกจไปยังแฟ้มในไดเรกทอรีที่ทำงานปัจจุบันของคุณชื่อ

คำอธิบาย

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

zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial

ตามด้วยรายการยาว ๆ ที่ติดตั้งโดยทั่วไป

awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > installed

ฉันเปรียบเทียบทั้งสองไฟล์initialแล้วและinstalledแสดงเฉพาะรายการที่ไม่ซ้ำกับที่ติดตั้ง

comm -23 installed initial > custom

จากที่นั่นฉันต้องการกรองการพึ่งพานี่คือที่วิธีนี้อาจพลาดแพ็คเกจที่ต้องการบางอย่างมันไม่รู้การพึ่งพาที่ติดตั้งไว้อย่างชัดเจนด้วย

ฉันเขียนฟังก์ชันทุบตีด่วนเพื่อย่อขั้นตอนนี้ในการประมวลผลรายการเหล่านี้

function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }

หลังจากนั้นฉันผ่านแต่ละบรรทัดจากแฟ้มของฉันในการทำงานนี้กับcustomxargs

echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps

เมื่อฉันมีรายการที่ยาวนานของการพึ่งพาที่เป็นไปได้ทุกอย่าง (ไม่แน่ใจในคำสั่งที่เป็นไปได้ทั้งหมด) ฉันจะได้บรรทัดที่ไม่ซ้ำกับไฟล์เดี่ยวอีกครั้ง

comm -23 custom deps > manual

และรายการแพคเกจที่เสร็จสมบูรณ์ของฉันตอนนี้อยู่ในไฟล์ชื่อmanualพร้อมให้ฉันตรวจสอบแล้ว


0

มีคนเชื่อมโยงกับhttps://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/3624#3624ซึ่งมีทางออกที่ดี แต่ไม่ทำงานอย่างถูกต้องเนื่องจากผลลัพธ์จากความถนัด มีการเปลี่ยนแปลง. นี่คือรุ่นที่อัปเดตแล้วอิงตามแพคเกจที่ติดตั้งในปัจจุบันเปรียบเทียบกับ 12.04 LTS คุณจะต้องaptitudeติดตั้งนั่นเป็นข้อกำหนดเพียงอย่างเดียว

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled && wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled && comm -23 currentlyinstalled defaultinstalled

ในการแบ่งคำสั่งด้านบนออกเป็นส่วน ๆ บิตนี้จะส่งเอาต์พุตหนึ่งแพ็กเกจต่อบรรทัดของทุกสิ่งที่ติดตั้งบนระบบ

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled

และนี่เป็นการดาวน์โหลดรายการแพ็คเกจเริ่มต้น & ครอบตัดข้อมูลที่ซ้ำซ้อน

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

และcommเปรียบเทียบทั้งสองไฟล์และส่งออกแพคเกจที่ arent ในรายการเริ่มต้น

comm -23 currentlyinstalled defaultinstalled

คุณยังสามารถไปที่ไซต์อื่นและอัปเดตคำตอบที่นั่น
Martin Ueding

0

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

https://gist.github.com/darrenleeweber/8cc570ff402f19af7fa4

#!/bin/bash

manifest_url='http://releases.ubuntu.com/releases/trusty/ubuntu-14.04.3-desktop-amd64.manifest'
manifest_file=$(echo $manifest_url | sed -e 's#.*/##g')
if [ ! -e $manifest_file ]; then
    wget -q $manifest_url
fi
cat $manifest_file | cut -f1 | sort -u > default_installed.txt

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

comm -23 currently_installed.txt default_installed.txt > manually_installed.txt

# sort the 'mannually_installed.txt' packages by architecture and section
mkdir -p package_files
while read p; do
    apt-cache show $p > info.txt
    arch=$(grep -m1 'Architecture: ' info.txt | sed -e 's/Architecture: //')
    section=$(grep -m1 'Section: ' info.txt | sed -e 's/Section: //' -e 's/\//_/g')
    file="${arch}_${section}_packages.txt"
    echo $p >> "package_files/$file"
done <manually_installed.txt

rm info.txt

มันจะง่ายต่อการแก้ไขไฟล์แพ็กเกจดังนั้นแต่ละบรรทัดจะนำหน้าด้วยapt-get install -y และไฟล์นั้นเป็นสคริปต์ทุบตี จากนั้นไฟล์แพ็กเกจทั้งหมดอาจรวมอยู่ในลูปการจัดเตรียมผู้ติดตาม
Darren Weber

0
#! /bin/sh
DEFAULT=`tempfile`
CURRENT=`tempfile`
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print $2}' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print $1}' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT

0

ฉันไม่พบที่เหมาะสมสำหรับฉันดังนั้นฉันจึงเขียนสคริปต์ โดยการวิเคราะห์เนื้อหาของ /var/log/apt/history.log* และ / var / log / aptitude จากนั้นจัดเรียงตามวันที่และเวลาส่งผลให้มีสองรายการหนึ่งรายการถูกติดตั้งด้วยตนเอง pkgs อีกรายการหนึ่งถูกติดตั้ง แต่ลบ pkgs ออก สคริปต์ที่มีการยืนยัน 'รายการ apt' ค่าเบี่ยงเบนเล็ก ๆ น้อย ๆ เพราะการใช้ dpkg ติดตั้งและแก้ไขแหล่ง PPA

ฉันใส่นี่https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl

หากใครต้องการทดสอบอาจต้องแก้ไขรหัสบางส่วนสำหรับไฟล์บันทึกของฉันจะผสมในภาษาจีนและอังกฤษ (รูปแบบวันที่เฉพาะ RFC2822 พิเศษ) ฉันต้องการจัดการกับมัน ป้อนคำอธิบายรูปภาพที่นี่


ภาพหน้าจอวอลล์ - ข้อความที่ไม่สามารถอ่านได้คืออะไร
muru

มันเป็นเอาท์พุทสคริปต์ของฉัน แต่วันนี้ฉันพบว่า dnf จาก Fedora มีประสิทธิภาพมากขึ้น "ประวัติ dnf" แสดงประวัติที่แท้จริงของการดำเนินการกับแพ็คเกจ
utopic eexpress

0

ฉันคิดว่าคุณต้องการใช้/var/log/apt/history.logและเพื่อน ๆ เพื่อให้การเปลี่ยนแปลงที่เกิดขึ้น:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt(?:-get)? install (?!.*--reinstall)\K.*'

(ดัดแปลงจากแหล่งที่มา )

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

จะได้รับไฟล์ซิปในไฟล์เก่าhistory.logที่เพิ่มด้วยปัจจุบันhistory.logและส่งผ่าน grep แยกบรรทัดด้วย apt [- รับ] ติดตั้ง [และ / หรือติดตั้งใหม่] และแสดงส่วนที่เหลือของบรรทัด (แฟล็ก -o) ซึ่งเป็นจำนวน ชื่อแพคเกจ

สิ่งนี้จะต้องมีการดัดแปลงเล็กน้อย (เช่นเมื่อใช้sed) หากคุณต้องการเพียงชื่อแพ็คเกจในแต่ละบรรทัด การออกกำลังกายสำหรับผู้อ่าน!

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


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