Bagaimana saya bisa mendaftar paket yang diinstal berdasarkan tanggal instalasi?
Saya perlu melakukan ini di debian / ubuntu. Jawaban untuk distribusi lain juga bagus.
Saya menginstal banyak hal untuk mengkompilasi sepotong kode tertentu, dan saya ingin mendapatkan daftar paket yang harus saya instal.
debian
package-management
apt
Elazar Leibovich
sumber
sumber
Jawaban:
Distribusi berbasis RPM seperti Red Hat mudah:
Pada Debian dan distribusi berbasis dpkg lainnya, masalah khusus Anda juga mudah:
Kecuali jika file log telah diputar, dalam hal ini Anda harus mencoba:
Secara umum,
dpkg
danapt
sepertinya tidak melacak tanggal pemasangan, terjadi karena tidak adanya bidang seperti itu didpkg-query
halaman manual.Dan akhirnya
/var/log/dpkg.log.*
file lama akan dihapus oleh rotasi log, sehingga cara itu tidak dijamin memberi Anda seluruh sejarah sistem Anda.Salah satu saran yang muncul beberapa kali (misalnya utas ini ) adalah untuk melihat
/var/lib/dpkg/info
direktori. File-file di sana menyarankan Anda untuk mencoba sesuatu seperti:Untuk menjawab pertanyaan Anda tentang pilihan, berikut ini pass pertama.
buat daftar paket berdasarkan tanggal
membangun daftar paket yang diinstal
bergabunglah dengan 2 daftar
Untuk beberapa alasan itu tidak mencetak banyak perbedaan bagi saya, jadi mungkin ada bug atau asumsi yang tidak valid tentang apa
--get-selections
artinya.Anda jelas dapat membatasi paket baik dengan menggunakan
find . -mtime -<days>
atauhead -n <lines>
, dan mengubah format output yang Anda inginkan, misalnyauntuk hanya daftar pilihan yang diinstal (diubah?) dalam 4 hari terakhir.
Anda mungkin bisa juga menghapus
sort
perintah setelah memverifikasi urutan yang digunakan olehdpkg --get-selections
dan membuatfind
perintah lebih efisien.sumber
apt-get
lebih dari iturpm
, tetapi sekarang debian mendapatkan -1 karena tidak menyimpan tanggal instalasi dalam database. Trik debian mencakup semua paket yang diinstal, bukan hanya paket yang dipilih , tetapi juga merupakan awal yang baik.half-installed
entri) jika Anda melakukannya:grep install\ /var/log/dpkg.log
grep " install " /var/log/dpkg.log
hanya mencantumkan baris "instal" daripada menunjukkan yang "status" juga.Mikel telah menunjukkan bagaimana melakukan ini di level dpkg . Khususnya,
/var/lib/dpkg/info/$packagename.list
dibuat ketika paket diinstal (dan tidak dimodifikasi setelahnya).Jika Anda menggunakan alat APT (yang mungkin Anda lakukan karena Anda khawatir tentang paket yang secara otomatis vs yang diinstal secara manual), ada riwayat di
/var/log/apt/history.log
. Selama belum diputar, ia tetap melacak semua instalasi, peningkatan, dan penghapusan APT, dengan anotasi untuk paket yang ditandai sebagai diinstal secara otomatis. Ini adalah fitur yang cukup baru, diperkenalkan di APT 0.7.26, sehingga di Debian muncul dalam keadaan terjepit. Di Ubuntu, 10,04 memilikihistory.log
tetapi anotasi yang diinstal secara otomatis tidak ada sampai 10,10.sumber
Kasar, tetapi bekerja:
sumber
ls
. Lihat mywiki.wooledge.org/ParsingLs untuk catatan tentang mengapa ini berbahaya / secara inheren bermasalah - opsi yang lebih aman adalah dengan menggunakan salah satufind -printf
ataustat --format
untuk menghasilkan aliran yang dapat diuraikan secara jelas.ls -al --time-style=long-iso
harus membantu. Selain itu, mungkin belum pernah ada orang yang menamai paket APT dengan\n\t\r\v
namanya.The
/var/log/apt/history.log
berkas memiliki format IMHO canggung.Saya lebih suka catatan format file log lebih
atau XML yang menunjukkan tidak hanya {paket} tetapi {dependensi} apa pun.
Seperti yang saat ini diterapkan, Anda dapat menemukan informasi yang Anda cari tetapi memerlukan beberapa proses forensik untuk mengekstrak detailnya.
sumber
Ini berfungsi bagi saya pada sistem Debian, saya menduga format file telah berubah sejak 2011. Sistem ini cukup segar sehingga saya tidak berharap ini bekerja pada sistem yang lebih lama, meskipun itu mungkin hanya memerlukan unzip log dan menggunakan gumpalan untuk merujuk mereka semua.
Dua bidang pertama di setiap baris file
/var/log/dpkg.log
adalah tanggal dan waktu. Perhatikan ruang trailing dengan instal di bagian grep, ini karena pemutakhiran dapat memicu pemasangan tetapi jika saya mengerti dengan benar Anda ingin tahu apa yang diinstal oleh pengguna.sumber
Ini adalah satu-baris yang diinginkan dan dibutuhkan setiap orang:
Hasilnya akan menampilkan semua paket (baru) yang diinstal dan ditingkatkan dalam urutan kronologis.
Penjelasan garis:
ls -1t
- dapatkan semuadpkg.log*
nama file dalam urutan kronologiszcat -f
- JIKA file berjenis gzip lalu dekompres, ELSE hanya meneruskan konten.tac
- Membalikkan output kucing , baris demi baris untuk memastikan kami mendapatkan urutan kronologis yang benar.grep
- Hanya memeriksa paket yang diinstal atau ditingkatkan .awk -F ':a'
- Pisahkan bidang arsitektur dari nama paketcolumn -t
- Cukup cetak kolom yang dipisahkan oleh ruangOrang tentu saja ingin membuat alias untuk ini, tetapi sayangnya tidak mungkin karena awk tergantung pada tanda kutip tunggal dan ganda. Dalam hal ini sebaiknya dimasukkan ke dalam skrip bash dan di mana
:
pemisah ditangani lebih baik untuk arsitektur lain di kolom bidang.Outputnya adalah:
Kekurangan:
sumber
Memperhatikan hal ini karena Anda menyebutkan bahwa jawaban distribusi lain diperbolehkan. rpm memiliki seperangkat tag format output yang besar, salah satunya adalah INSTALLTIME. (Menggunakan
wget
sebagai contoh)Ini dapat diformat dalam beberapa cara. Saya menggunakannya dengan cara ini:
Dua halaman ini memiliki banyak info hebat untuk memecahkan masalah metadata RPM:
http://www.rpm.org/max-rpm/s1-rpm-query-parts.html
http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html
Menyortir informasi ini akan memberi Anda solusi yang berfungsi untuk masalah Anda.
sumber
GNU / Linux Debian tidak memiliki alat bawaan untuk masalah ini, tetapi semua informasi tentang program yang diinstal dengan cara standar disimpan dalam file dengan nama -program.daftar di lokasi / var / lib / dpkg / info / . Tetapi tidak ada informasi tentang program yang diinstal secara manual di sana.
Solusi garis panjang yang panjang :
Penjelasan :
ls -rt
output file diurutkan berdasarkan modifikasi tanggal dalam urutan terbalik, yaitu dengan file terbaru di akhir daftar.stat
mencetak tanggal file dalam bentuk yang dapat dibaca manusia.printf
menampilkan nama paket dan tanggal modifikasi terakhirnya.for
Loop secara keseluruhan nama cetak paket dan tanggal dari yang terlama ke terbaru.Contoh keluaran (terpotong):
Cacat utama dari solusi ini adalah bahwa itu tidak teruji dengan baik dalam produksi.
sumber
/var/lib/dpkg/info/
. Itu juga mengapa menggunakan/var/log/dpkg.log*
mungkin lebih disukai.Itu kasar, tetapi bekerja secepat solusi lain. Format tanggal adalah yyyymmddhhmmss, yang berarti bahwa sedikit atau pemesanan ulang dan memformat hasil penghapusan dalam angka yang dapat diurutkan.
Banyak terima kasih kepada solusi lain, daftar nama paket ini dalam urutan instalasi yang dapat digunakan dalam membangun untuk membuat sistem operasi salinan.
sumber