Daftar paket yang diinstal secara eksplisit

53

Di Gentoo ada file /var/lib/portage/worldyang berisi paket yang saya instal secara eksplisit. Secara eksplisit maksud saya, paket yang saya pilih, tidak termasuk apa pun yang diinstal secara default, atau ditarik oleh dependensi.

Apakah ada file atau perintah serupa untuk menemukan informasi itu di Ubuntu?

phhehehe
sumber

Jawaban:

46

Hanya kodenya

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
  | cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

Penjelasan

Salah satu cara untuk memikirkan masalah ini adalah memecahnya menjadi tiga bagian:

  • Bagaimana cara saya mendapatkan daftar paket yang tidak diinstal sebagai dependensi?
  • Bagaimana cara mendapatkan daftar paket yang diinstal secara default?
  • Bagaimana saya bisa mendapatkan perbedaan antara kedua daftar ini?

Bagaimana cara saya mendapatkan daftar paket yang tidak diinstal sebagai dependensi?

Perintah berikut tampaknya berfungsi di sistem saya:

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

Pendekatan serupa dapat ditemukan di tautan yang diposting Gilles sebagai komentar untuk pertanyaan itu. Beberapa sumber mengklaim bahwa ini hanya akan berfungsi jika Anda menggunakan aptitude untuk menginstal paket; Namun, saya hampir tidak pernah menggunakan aptitude untuk menginstal paket dan menemukan bahwa ini masih berfungsi. The --disable-columnsmencegah aptitude dari bantalan di baris nama paket dengan kosong yang akan menghambat perbandingan di bawah ini. The | sort -umacam file dan menghapus duplikat. Ini membuat langkah terakhir lebih mudah.

Bagaimana cara mendapatkan daftar paket yang diinstal secara default?

Catatan: Bagian ini dimulai dengan 'jalan yang salah' yang menurut saya ilustratif. Bagian kedua dari kode adalah yang berfungsi.

Ini agak sulit. Saya awalnya berpikir bahwa perkiraan yang baik adalah semua paket yang merupakan dependensi dari meta-paket ubuntu-minimal, standar-ubuntu, desktop-Ubuntu, dan berbagai paket yang terkait dengan kernel linux. Beberapa hasil pencarian Google tampaknya menggunakan pendekatan ini. Untuk mendapatkan daftar dependensi ini, saya pertama kali mencoba yang berikut (yang tidak berfungsi):

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

Ini sepertinya mengabaikan beberapa paket yang saya tahu harus datang secara default. Saya masih percaya bahwa metode ini harus bekerja jika ada yang membangun daftar metapackage yang tepat.

Namun, tampaknya mirror Ubuntu berisi file "manifes" yang berisi semua paket dalam instalasi default. Manifes untuk Ubuntu 12.04.3 ada di sini:

http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest

Jika Anda mencari melalui halaman ini (atau halaman cermin lebih dekat dengan Anda):

http://mirror.pnl.gov/releases/precise/

Anda harus dapat menemukan file ".manifest" yang sesuai dengan versi dan arsitektur yang Anda gunakan. Untuk mengekstrak hanya nama paket yang saya lakukan ini:

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

Daftarnya mungkin sudah diurutkan dan unik, tetapi saya ingin memastikan daftar itu sudah diurutkan dengan benar untuk membuat langkah selanjutnya lebih mudah. Saya kemudian memasukkan output defaultinstalled.txt.

Bagaimana saya bisa mendapatkan perbedaan antara kedua daftar ini?

Ini adalah bagian yang paling mudah karena kebanyakan sistem mirip Unix memiliki banyak alat untuk melakukan ini. The commAlat adalah salah satu dari banyak cara untuk melakukan ini:

comm -23 currentlyinstalled.txt defaultinstalled.txt

Ini harus mencetak daftar baris yang unik untuk file pertama. Dengan demikian, ia harus mencetak daftar paket yang diinstal tidak dalam instalasi default.

Steven D
sumber
Apa yang dilakukan saluran pipa pertama Anda aptitude search '~i!~M' -F %p?
ephemient
@ephemient: Mungkin tidak ada. Saya tidak tahu banyak tentang aptitude dan dengan demikian menggunakan alat yang saya kenal daripada menggali di dalam file manual dari program yang tidak pernah saya gunakan.
Steven D
1
Anda agak menghancurkan harapan saya, saya pikir ada beberapa cara mudah standar :(
phunehehe
3
Ini hampir berhasil, tetapi masih belum benar. Ada beberapa paket dan pustaka yang tentu saja tidak saya instal secara manual yang terdapat dalam daftar yang dihasilkan. Saya menggunakan http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifestdan tambahan | sed "s/ *$//"tetapi masih tidak ada dadu.
jmiserez
1
Langkah pertama yang mendapatkan daftar paket yang tidak diinstal sebagai dependensi dapat diganti apt-mark showmanual | sort -u, seperti yang ditunjukkan pada jawaban lain. Lebih sederhana, dan tidak bergantung pada aptitudeyang tidak diinstal secara default.
skagedal
24

Anda dapat menggunakan salah satu dari dua baris satu ini. Keduanya menghasilkan output yang sama persis pada mesin saya dan lebih tepat daripada semua solusi yang diajukan sampai sekarang (Juli 2014) dalam pertanyaan ini. Mereka adalah kombinasi dari dua jawaban (1) dan (2) . Perhatikan bahwa saya awalnya mengirim jawaban ini di sini .

Menggunakan apt-mark:

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

Menggunakan aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Sangat sedikit paket masih jatuh melalui celah-celah, walaupun aku curiga ini yang benar-benar dipasang oleh pengguna, baik tepat setelah instalasi melalui bahasa lokalisasi setup atau misalnya melalui Totem codec installer. Juga, versi linux-header juga tampaknya menumpuk, meskipun saya hanya menginstal metapackage non-spesifik. Contoh:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

bagaimana cara kerjanya

  1. Dapatkan daftar paket yang diinstal secara manual. Untuk aptitude, sedstrip tambahan mengeluarkan spasi kosong di akhir baris.
  2. Dapatkan daftar paket yang diinstal tepat setelah instalasi baru.
  3. Bandingkan file, hanya output baris dalam file 1 yang tidak ada dalam file 2.

Kemungkinan lain tidak berfungsi juga:

  • Menggunakan ubuntu-14.04-desktop-amd64.manifestfile (di sini untuk Ubuntu 14.04) alih-alih /var/log/installer/initial-status.gz. Lebih banyak paket ditampilkan sebagai diinstal secara manual meskipun tidak.
  • Menggunakan apt-mark showautobukan /var/log/installer/initial-status.gz. apt-markmisalnya tidak menyertakan paket xserver-xorg, sedangkan file lain tidak.

Keduanya mendaftar lebih banyak paket daripada solusi di atas.

jmiserez
sumber
Jika Anda telah memutakhirkan sistem Anda sejak instalasi awal Anda (yang merupakan kasus bagi kebanyakan orang, saya pikir), lebih baik menggunakan file manifes dari versi rilis Ubuntu Anda saat ini.
Diego V
Jika Anda telah meningkatkan, saya pikir Anda harus menggunakan kedua file, bukan hanya file manifes. Anda dapat dengan mudah melakukannya dengan hanya menambahkan perbandingan lain. File manifes sayangnya tidak mengandung semua yang dilakukan oleh file initial_status.gz (saya telah memeriksa).
jmiserez
Saya terkesan! Saya menemukan bagian yang hilang. Bagaimana dengan paket yang awalnya diinstal tetapi kemudian dihapus secara manual , namun kemudian secara manual diinstal ulang secara manual ? Saya menemukan ini dalam sistem kerja.
n611x007
1
Saya telah membuat pertanyaan unix.SE/225330: Daftar paket yang dihapus secara eksplisit (apt) untuk mengatasi sebagian besar pekerjaan.
n611x007
1
Ini lebih baik daripada solusi yang diterima, karena mirror.pnl.gov/releases/precise/… URL dalam solusi yang diterima sekarang menjadi 404.
rmunn
9

Menurut man apt-mark:

apt-mark showauto
apt-mark showmanual
mmaruska
sumber
2
showmanualmenunjukkan hal-hal seperti xserver-xorg-video-vesa, yang saya bersumpah tidak saya instal secara manual.
phunehehe
mungkin diinstal secara otomatis oleh distro Anda saat instalasi pertama.
Matt
8

Berikut beberapa contoh output cat /var/log/apt/history.log:

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

Adapun pertanyaan Anda, filter barang-barang dengan grep ( cat /var/log/apt/history.log | grep Commandline).

Perhatikan bahwa file-file ini diputar, jadi periksalah yang lain agar Anda tidak kehilangan apa pun:

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

CATATAN :

  • Saya telah memeriksa aptitude dan synaptic ( masing-masing versi 0.70 dan 0.6.3 ), dan keduanya mencatat aktivitas mereka pada file log itu. Satu halangan dengan mereka adalah bahwa mereka tidak memiliki garis yang dimulai dengan Commandline, jadi greptriknya tidak akan bekerja dengan mereka.
tepang
sumber
2
Solusi menarik. Anda harus sedikit menyesuaikan perintah grep untuk mendapatkan daftar paket dan memperhitungkan paket yang diinstal oleh aptitudedan manajer paket lainnya. Jika log Anda telah diputar, Anda tidak beruntung.
Steven D
@steven Diperbarui. Grep-fu saya seorang pemula, jadi saya akan menyerahkannya kepada pembaca. Juga, saya tidak tahu apakah benda itu berputar. Saya hanya perlu file di sana sendiri.
tshepang
Apakah mereka berputar akan tergantung pada pengaturan logrotate Anda dan berapa lama sistem Anda telah ada. Saya tidak yakin tentang default Ubuntu karena sudah lama sejak saya mengubahnya.
Steven D
7

Saya menemukan oneliner cantik ini ketika saya sedang mencari permintaan ini

Satu liner adalah

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

Oneliner ini menyaring paket yang diinstal oleh sistem menggunakan log dari /var/log/installer/initial-status.gz

Saya akan memposting tautan ke utas asli ketika saya menemukannya, karena oneliner ini bukan milik saya dan sepertinya saya tidak ingat di mana saya melihatnya.

Archit
sumber
3

Anda ingin melihat artikel ini .

Di akhir artikel, ada skrip python yang harus melakukan apa yang Anda inginkan.

Itu ditulis untuk (k) ubuntu . tetapi harus bekerja untuk Ubuntu juga.

Stefan
sumber
3
tautannya sepertinya tidak lagi berfungsi.
rog
2
Tautan yang rusak seperti ini adalah mengapa penting untuk memasukkan informasi yang relevan dalam jawaban Anda.
whitehat101
2

Di bawah ini adalah Selain Steven D's jawaban .

Baris berikut tampaknya memotong nama paket dengan 32 karakter:

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

Ini sepertinya berhasil:

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

lihat jawaban ini

Wes Turner
sumber
1

Periksa /var/log/apt/term.log

Joril
sumber
2
itu cara yang agak menyakitkan untuk melakukan sesuatu, dan tidak ada perbedaan antara paket yang saya instal sendiri, dan yang ditarik oleh dependensi
phunehehe
Saya setuju, tetapi saya tidak tahu bahwa ia harus melacak mereka: / Sekarang saya tahu, terima kasih kepada Stefan :)
Joril
1

Anda juga dapat melihat file /var/lib/apt/extended_states.

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

Ini berguna jika Anda ingin tahu apa yang diinstal pada partisi lama.

Laurent Lyaudet
sumber
0

Terima kasih dan selamat untuk mereka yang telah menemukan permata naskah !!!
Saya ingin menambahkan 2 ¢ dan saya memasang tanggal pemasangan yang saya simpulkan dari $ info.
Saya tidak menguasai detail mengapa $ info file diperbarui atau tidak dan kapan, tetapi itu berhasil dalam praktiknya.
Skrip saya mencantumkan pembaruan terbaru dari paket non-dependensi yang ditambahkan setelah instalasi.
Memberikannya pemeriksaan berkala, saya melihat apa yang akan saya login secara manual tanpa satu pun kesalahan.
Yaitu, kumpulan paket yang dipasang untuk alasan yang sama. Sayangnya, pembaruan merusak urutan itu.
Setelah pemutakhiran sistem, saya memiliki daftar paket tambahan saya yang pemutakhirannya tidak diperbarui diikuti oleh orang-orang yang melakukannya.
Rapi! Nikmati.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(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) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
Papou
sumber