Bagaimana menemukan paket yang diinstal secara manual?

48

Saya memasang Ubuntu 10.10 di komputer saya dan menginstal beberapa perangkat lunak melalui apt-get. Minggu lalu saya berhasil memecahkan semuanya dan baru saja memulai dari awal, dan saya perlu menginstal ulang perangkat lunak saya. Apakah ada cara untuk membuat daftar dengan semua paket yang telah saya instal secara manual?

Jadi itu akan memberi saya daftar suka texlive, ...dan tidak texlive, texlive-dep1, textlive-dep2, ...dan semua paket standar dihapus?

Jika saya entah bagaimana bisa mengetahui program mana dari instalasi biasa yang telah saya hapus, itu juga luar biasa!


Pembaruan 2015-05-23: Saya sekarang menggunakan Ansible sebagai manajemen konfigurasi pada sistem saya. Di sana saya menentukan paket yang akan diinstal. Ini melayani tujuan, menginstal semua program pada sistem baru, bahkan lebih baik. Jadi pertanyaan ini mungkin merupakan entri ke beberapa manajemen konfigurasi ringan.

Martin Ueding
sumber

Jawaban:

24

Dengan saran ini, saya berasumsi instalasi lama Anda akan tetap boot!

Untuk mereplikasi satu set paket di komputer lain:

Pada Sistem A, jalankan:

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

Pindahkan my-selectionsfile ke Sistem B.

Pada Sistem B, jalankan:

dpkg --set-selections < my-selections

lalu:

sudo apt-get dselect-upgrade

Catatan penting: jika Anda telah menginstal paket dari repositori dan / atau PPA non-standar, Anda juga ingin menyalin /etc/apt/sources.listdan isi /etc/apt/sources.list.d/dari Sistem A ke Sistem B sebelum Anda menjalankan peningkatan.

Anda dapat menggunakan dpkguntuk melihat apa yang telah Anda hapus juga (NB: ini juga akan termasuk paket yang Anda instal dan hapus secara manual ):

dpkg --get-selections | grep deinstall

Anda dapat melihat hasil Anda di terminal, atau, tentu saja, redirect ke file.

Mark Russell
sumber
9
Saya ingin mendapatkan daftar semua paket, tetapi saya hanya ingin memiliki nama-nama paket yang saya instal secara eksplisit. Jadi adil somethingdan tidak something-commonbaik.
Martin Ueding
6
Ya sementara ini berguna, itu tidak melakukan apa yang ditanyakan.
Timmmm
3
Jika Anda melakukan ini, maka dependensi yang diinstal secara otomatis tidak akan pernah dibersihkan ketika Anda menghapus program. Mengapa orang memberikan suara pada jawaban yang melakukan apa yang menurut penanya tidak dia inginkan?
jbo5112
20

Utas ini dari superuser.com memberikan solusi ini:

aptitude search '?installed ?not(?automatic)'
Jason
sumber
2
Ini tidak berhasil untuk saya. Cukup cantumkan semua yang diinstal, atau tentu saja lebih dari yang saya minta secara eksplisit.
Timmmm
Ini daftar semua yang telah Anda instal apt-get, ditambah ketergantungannya. Jadi, misalnya, jika Anda menginstal aptitude, maka itu juga akan menampilkanapt-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

Jika apt log Anda ada di / var / log / apt, sesuatu seperti ini seharusnya berfungsi:

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

Atau jika Anda ingin menyingkirkan beberapa sampah berulang di output:

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

Anda dapat menggunakan apt-mark , tetapi saya merekomendasikan debfoster :

sudo apt-get install debfoster
sudo debfoster

Ini akan memeriksa semua paket yang diinstal dan mencari tahu yang mana yang tetap diinstal:

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:

Saat Anda menjawab "y" untuk setiap pertanyaan (cukup tekan Enter untuk bergerak cepat), debfoster akan mengumpulkan daftar paket dan menuliskannya baris demi baris ke file. Secara default ini di /var/lib/debfoster/keepers. Ini terlihat seperti ini:

gnome-do
texlive-full
...

Saya mengkonfigurasi debfoster via /etc/debfoster.confuntuk meletakkan daftar ini di /etc/debfoster-keepersdan melacak file dengan dllkeeper untuk menjaga riwayat dan cadangan. The jawaban di sini menunjukkan cara menginstal daftar paket dari file teks baris-delimited:

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

Perhatikan batasannya di sini, paket yang telah Anda hapus memiliki tanda '-' di depannya. Jadi, Anda ingin menghapus baris-baris itu sebelum memanggil apt-mark.

Meskipun situs web debfoster mengatakan bahwa debfoster tidak digunakan lagi karena kemampuan, saya lebih suka konfigurasi debfoster yang cepat dan sederhana. Ini menempatkan Anda di tengah-tengah basis data paket Anda dan memungkinkan Anda membersihkan segalanya, menjadikan paket otomatis dan manual lebih jelas.

Ketik "h" di prompt debfoster untuk menjelaskan opsi Anda. Tipe "?" untuk melihat deskripsi paket. Cara di sini mungkin bermanfaat.

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

Memberikan semua paket yang diinstal secara manual (bukan paket sistem, bukan dependensi). Sebagai contoh itu menunjukkan build-essentialtetapi tidak gcc.

ecerulm
sumber
3

Bagi mereka yang lebih suka menggunakan alat apt-*, ada utilitas apt-mark yang memungkinkan query dan memodifikasi keadaan manual / otomatis.

apt-mark showmanual

Anda juga dapat menentukan pola untuk paket yang Anda minati:

apt-mark showmanual qemu\*
Alexander Koptelov
sumber
Ini tiketnya.
John Von Neumann
2

Saya akhirnya mengerti sekarang:

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"
Martin Ueding
sumber
2
Saya kira ini hanya berfungsi jika Anda hanya menginstal paket menggunakan aptitude. Ada file serupa di /var/log/apt/history.log(.N.gz)olah.
Timmmm
Anda dapat menggunakannya zgrepsebagai ganti gunzipatau zcatdisalurkan ke grep. Ini adalah skrip pembungkus yang dikirimkan dengan gzip, saya percaya. Ini juga menerima file yang tidak dikompresi, sehingga Anda dapat menyederhanakan skrip Anda kezgrep -E '(\[INSTALLIEREN\]|\[INSTALL\])' /var/log/aptitude* | awk '{ print $2 }'
Steve Buzonas
2

Saya dapat menarik semuanya dengan membuka file log di / var / log / apt /

Saya kemudian masuk dan secara manual menyaring paket instalasi apt-get. Mungkin ada cara untuk melakukan ini secara terprogram tetapi saya tidak menyadarinya.

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

dengan cara ini Anda melihat daftar perintah yang dilakukan di masa lalu.

Hapus kode grep jika Anda memerlukan informasi lebih lanjut:

less history.log

jika log dikompresi (yaitu diakhiri dengan gz)

gunzip <filename>

untuk zip lagi ketika selesai Anda dapat melakukan:

gzip <filename>
Zen
sumber
1
Alih-alih mengompresi dan mengkompres ulang file log, mengapa tidak digunakan zcat? Ini semudah zcat filename.gz. Satu hanya dapat menggunakannya pada file terkompresi gzip di tempat cat. Juga grepbisa diganti dengan zgrep, mis zgrep Commandline history.log.1.gz.
lgarzo
Berdasarkan ide Anda saya sudah datang dengan baris perintah: (grep "Commandline" history.log ; zgrep "Commandline" history.log.*.gz ) | grep " install " | grep -v -- "--yes" | sed -r "s/^.*install //". Ini memiliki kekurangan, karena paket-paket yang dihapus juga terdaftar, dan jika sebuah paket diinstal lebih dari satu kali, ia terdaftar beberapa kali.
lgarzo
1

Saya tidak melihat solusi apa pun yang berfungsi untuk saya, saya telah menginstal beberapa paket deb dengan dpkg dan beberapa item yang saya cari secara khusus hilang.

Liner satu yang agak panjang, tetapi nyaman untuk menyalin dan menempel adalah:

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

Perintah di atas menyimpan daftar paket ke file di direktori kerja Anda saat ini bernama my-packages.

Penjelasan

Saya pertama kali membangun daftar paket yang menyusun garis dasar paket yang dipilih selama instalasi.

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

Diikuti oleh daftar panjang item yang diinstal secara umum.

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

Saya kemudian membandingkan dua file initialdan installeduntuk daftar hanya item yang unik untuk diinstal.

comm -23 installed initial > custom

Dari sana saya ingin menyaring dependensi, di sinilah metode ini mungkin melewatkan beberapa paket yang diinginkan, tidak menyadari dependensi yang juga diinstal secara eksplisit.

Saya menulis fungsi bash cepat untuk mempersingkat langkah ini dalam memproses item ini.

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

Setelah itu saya melewati setiap baris dari file saya customke fungsi ini dengan xargs.

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

Setelah saya memiliki daftar panjang setiap ketergantungan yang mungkin, (tidak yakin pada setiap pernyataan yang mungkin), saya sekali lagi mendapat garis yang unik untuk satu file.

comm -23 custom deps > manual

Dan daftar paket jadi saya sekarang dalam file bernama manualtersedia untuk saya tinjau.

Steve Buzonas
sumber
0

Seseorang ditautkan ke https://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/3624#3624 yang memang memiliki solusi yang baik, tetapi, itu tidak berperilaku sebagai output dari aptitude. telah berubah. Ini adalah versi yang diperbarui, berdasarkan perbandingan antara paket yang diinstal saat ini dibandingkan dengan 12,04 LTS. Anda perlu aptitudediinstal, itu adalah satu-satunya persyaratan.

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

Untuk memecah perintah di atas menjadi beberapa bagian, bit ini mengeluarkan satu paket per baris dari semua yang diinstal pada sistem

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

Dan ini mengunduh daftar paket default & memotong informasi yang berlebihan.

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

dan commmembandingkan dua file dan menampilkan paket-paket yang tidak ada dalam daftar default.

comm -23 currentlyinstalled defaultinstalled
johndrinkwater
sumber
Anda juga dapat pergi ke situs lain dan memperbarui jawabannya di sana.
Martin Ueding
0

Gunakan file manifes distribusi sebagai paket dasar yang ditetapkan. Urutkan hasil yang diinstal secara manual ke dalam grup paket menurut arsitektur dan bagian, sehingga lebih mudah untuk fokus pada kelompok paket (mungkin Anda tidak peduli dengan beberapa bagian).

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
Darren Weber
sumber
Akan mudah untuk memodifikasi file paket sehingga setiap baris diawali dengan apt-get install -y dan file tersebut adalah skrip bash. Kemudian semua file paket bisa dimasukkan dalam loop ketentuan gelandangan.
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
Huh
sumber
0

Saya tidak menemukan satu yang cocok untuk saya, jadi saya menulis naskah. Dengan menganalisis isi /var/log/apt/history.log* dan / var / log / aptitude, lalu urutkan berdasarkan datetime, menghasilkan dua daftar, satu diinstal pkg secara manual, yang lain diinstal tetapi dihapus pkg. Skrip dengan verifikasi 'daftar apt'. sedikit penyimpangan, karena penggunaan dpkg dipasang dan dimodifikasi sumber PPA.

Saya taruh di sini, https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl .

jika ada yang perlu mengujinya, mungkin perlu memodifikasi beberapa kode, untuk file log saya dicampur dalam bahasa Cina dan Inggris (khususnya format datetime RFC2822), saya perlu menghadapinya. masukkan deskripsi gambar di sini

eexpress utopis
sumber
Apa tangkapan layar wall-of-text yang tidak dapat dibaca itu?
muru
Ini hasil skrip saya. Tetapi hari ini saya menemukan DNF dari Fedora lebih efektif. "dnf history" menunjukkan riwayat murni operasi paket.
utopic eexpress
0

Saya pikir Anda ingin menggunakan /var/log/apt/history.logdan teman-temannya untuk memberikan perubahan yang telah dibuat:

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

(Dimodifikasi dari sumber )

Akan memberi Anda semua paket yang telah diinstal di baris perintah menggunakan variasi apt-get install.

Ini mendapatkan file zip di yang lama history.logmenambahkannya dengan arus history.logdan melewati grep, mengekstraksi baris dengan apt [-gunakan] instal [dan / atau instal ulang] dan menunjukkan sisa baris (-o flag) yang berjumlah nama paket

Ini akan membutuhkan sedikit modding (misalnya dengan sed) jika Anda ingin hanya nama paket pada baris yang berbeda; latihan untuk pembaca!

Perlu dicatat bahwa pengelola paket sinaptik ( gksu synapticatau kdesudo synaptic) di bagian "status" memiliki daftar "terpasang (secara manual)". Jika Anda menandai seluruh daftar untuk dihapus [tidak berlaku !!] Anda harus dapat menyimpan perubahan yang ditandai dan mendapatkan daftar paket dengan cara itu. Perhatian: ini dikunci synapticuntuk saya (menghitung penghapusan dependensi mungkin).

pbhj
sumber
Disalin dari jawaban saya di tempat lain.
pbhj