Temukan semua paket yang diinstal pengguna


38

Apakah ada cara untuk mendapatkan daftar semua paket yang diinstal pengguna pada sistem Ubuntu, yaitu paket yang diinstal di atas paket yang diinstal default?

(Idenya adalah untuk mendapatkan daftar lengkap yang dapat digunakan untuk menginstal paket yang sama pada instalasi Ubuntu yang bersih)

Jawaban:


15

Lihat file-file ini,

  1. ' /var/log/installer/initial-status.gz' - instalasi utama Anda
    • tanggal file ini akan menjadi tanggal instalasi Anda (saya pikir)
    • ' /var/log/dpkg.log' Update waktu (ini adalah apa yang Anda inginkan)
    • ' /var/log/apt/term.log' - hal-hal yang aptdiperbarui pada sistem Anda
    • ' /var/cache/apt/archives/'akan berisi debpaket yang diunduh untuk instalasi

Pembaruan: gunakan dua langkah berikut untuk daftar pemasangan baru yang tepat:

  1. menjalankan: grep -w install /var/log/dpkg.log > full-list.log
  2. Lihat garis di luar /var/log/installer/initial-status.gzcap waktu

Karena Anda ingin mendapatkan instalasi bersih pada sistem lain dengan paket-paket ini, Anda bahkan dapat menyalin file 'deb' dari jalur 'cache / apt / arsip' ke instalasi baru dan membuatnya diinstal dalam satu kesempatan (tanpa mengunduh mereka lagi).


Terima kasih atas tipnya. Ini berguna, walaupun saya mencari lebih dari satu perintah untuk mendapatkan daftar ini. cat /var/log/dpkg.log | grep 'instal' sepertinya akan menutup jika saya mengabaikan item yang diinstal hingga tanggal / waktu instalasi
Rabarberski

Menambahkan alasan untuk suara turun akan membantu memahami masalah dalam jawaban, jika ada. Juga akan mengarah pada jawaban yang lebih baik di masa depan.
nik

Ya, downvote itu sengaja milik saya. Saya sudah membatalkan jawaban Anda. Ketika saya mencoba menandai jawaban Anda sebagai 'final', saya salah memilih dan menekan panah ke bawah. Mencoba untuk membatalkannya ditampilkan pesan: "Pilih terlalu lama untuk diubah, kecuali jawaban ini diedit." Maaf nik, baik untuk downvote dan kebingungan. :-(
Rabarberski

@Rabarberski, yah itu terjadi ... tidak ada salahnya dilakukan.
nik

tidak berfungsi jika / var / log / installer tidak ada, seperti pada instalasi server. Juga masuk akal untuk menambahkan ANGKA VERSI jika Anda berbicara tentang "Ubuntu" - Ubuntu yang mana?

8

Hanya untuk menyeringai, saya mengumpulkan satu-liner (di sini dibagi untuk kejelasan) yang menggambarkan paket yang diinstal secara manual , tidak termasuk yang diinstal pada awalnya dan paket apa pun yang diinstal secara otomatis:

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

Ini berfungsi baik di dalam bashmaupun di zsh.


Ini berfungsi hampir sempurna, kecuali tampaknya untuk mencetak banyak perpustakaan yang diinstal selama instalasi awal. Ada sekelompok libtiff, libxcb, dll yang saya tidak menginstal sendiri. Jawaban ini: superuser.com/a/105000/24349 menanganinya dengan mengurutkan menurut waktu pemasangan dan menghapus semuanya sebelum waktu instalasi sistem. Penggunaan shell yang hebat!
haxney

3

Berdasarkan informasi di atas, saya menulis skrip Python pendek untuk mendaftar paket yang diinstal secara manual. Lihat tautan ini .

Jangan ragu untuk menggunakannya meskipun saya tidak bertanggung jawab untuk itu. Namun, umpan balik dan saran selalu diterima.


Cemerlang! Butuh beberapa saat untuk menjalankan, tetapi itu satu-satunya solusi yang saya temukan yang melakukan persis apa yang saya butuhkan!
haxney

2
Sayangnya tautan ini sekarang rusak (menunjukkan traceback python) yang menunjukkan nilai dari menempatkan jawaban di sini (terutama untuk "skrip python pendek"
David Ljung Madison Stellar

Menemukan repo github dengan skrip: github.com/gerjantd/bin/blob/master/... Klik 'mentah' untuk mengunduh, dan jalankan dengan 'python list_manually_installed_packages.py'
David Ljung Madison Stellar

2
Tautan github sekarang juga rusak ...
Suzana


1

dengan asumsi Anda memiliki riwayat yang konsisten dan menggunakan bakat:

history | grep -e "^..... aptitude install"

akan mendaftar hanya paket yang Anda instal dengan aptitude install ... ya


1

Ini adalah hack-job, tetapi benar-benar berfungsi.

Pertama, buka http://releases.ubuntu.com/maverick/ (atau versi Ubuntu apa pun yang Anda gunakan) dan ambil *.manifest fileyang terkait dengan versi Ubuntu yang Anda gunakan.

Kemudian, jalankan skrip berikut (mengganti <manifest file>, kurung sudut dan semuanya, dengan path ke file yang Anda unduh. Anda selalu dapat menambahkan > outputsampai akhir untuk membuat dump file.

diff --suppress-common-lines <(sed 's/ .*//' <manifest file>) <(dpkg --get-selections | sed 's/[ \t].*//') | grep '>' | sed 's/[>] //'

1

Terima kasih geekosaurus, kode yang bagus. Saya menggunakannya tetapi butuh beberapa saat untuk mencari tahu cara membuatnya bekerja. Inilah cara saya melakukannya di Ubuntu 11.10 — ia bekerja di terminal bash:

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) \
  ) > user-installed-packages

Kemudian untuk menambahkan tab— \t—dan installpada setiap baris:

sed 's/$/\tinstall/' user-installed-packages >uip

Kemudian pada mesin baru:

sudo dpkg --set-selections < uip

Dan untuk menginstal paket:

sudo apt-get dselect-upgrade

0

Cara lain untuk melakukan ini adalah dengan menentukan apa yang telah diinstal berdasarkan pada "tugas" Anda yang menentukan paket dasar untuk diinstal sesuai dengan kebutuhan awal Anda.

tasksel --list-tasks

Paling tidak Anda akan punya server. Namun, Anda dapat memilih untuk memiliki lebih banyak. Untuk setiap tugas yang telah Anda instal, Anda bisa mendapatkan daftar paket yang diinstal dengan perintah berikut melakukan semuanya dalam satu baris (dipecah untuk kejelasan) untuk yang saya pilih dalam instalasi saya:

(tasksel --task-packages server ; \
 tasksel --task-packages openssh-server ; \
 tasksel --task-packages lamp-server) | sort | uniq

Pendekatan umum untuk hal di atas adalah:

(for a in $( tasksel --list-tasks | grep "^i" | awk '{ print $2 }' ) ; \
 do tasksel --task-packages $a; done) | sort | uniq

Sekarang gunakan apt-cache depends --installed -i --recurse <packagename> | grep -v "^ "untuk mendapatkan daftar dependensi yang digunakan oleh semua paket yang ditentukan dalam tugas. Ini dapat dilakukan dalam satu baris sebagai berikut

apt-cache depends --installed -i --recurse \
     $(for a in $( tasksel --list-tasks | \
                   grep "^i" | \
                   awk '{ print $2 }' ) ; \
       do tasksel --task-packages $a; done) | grep -v "^ " | sort | uniq

Berikut ini daftar semua paket yang diinstal di sistem Anda (tidak termasuk dependensi).

dpkg --get-selections | grep "[[:space:]]install" | awk '{print $1}'

Sekarang gunakan commperintah untuk menemukan yang ada di daftar kedua saja (yaitu abaikan yang ada di kedua file dan hanya file pertama)

comm -13 <(apt-cache depends --installed -i --recurse \
              $(for a in $( tasksel --list-tasks | \
                            grep "^i" | \
                            awk '{ print $2 }' ) ; \
                do tasksel --task-packages $a; done) | grep -v "^ " | sort ) \
         <( dpkg --get-selections | grep "[[:space:]]install" | \
            awk '{print $1}' | sort)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.