Bagaimana cara saya mendapatkan daftar paket usang?

19

Saya mencoba mencari cara untuk mendapatkan daftar paket yang tidak lagi tersedia di repositori yang telah saya aktifkan. Workstation ini telah melalui beberapa versi Ubuntu dan telah memiliki banyak repositori pihak ketiga yang ditambahkan dan dihapus. Saya ingin mendapatkan daftar perangkat lunak yang saya miliki dari repositori yang dihapus ini, jadi saya bisa membersihkannya atau menambahkan kembali repositori yang sesuai.

Sean
sumber

Jawaban:

23
aptitude search '~o'

Aptitude memiliki beberapa pencarian yang sangat kuat yang tersedia. Sayangnya sintaksnya agak sulit digunakan dan Anda harus menggali melewati halaman manual untuk menemukan dokumentasi, tetapi nilainya sepadan.

apt-show-versi juga dapat membantu:

apt-show-versions | grep 'No available version'
rebus
sumber
1
lihat artikel yang bagus tentang paket usang di sini: raphaelhertzog.com/2011/02/07/…
Lluís
Daftar lain yang berguna dihasilkan olehapt-show-versions | grep "newer than version in archive"
Sean
Saya pikir apt-show-versi adalah yang terbaik hanya karena garis aptitude sangat kontra-intuitif untuk diingat. Setiap kali saya membutuhkannya, saya harus google / mencarinya / menyimpannya / membuat skrip / etc.
j riv
6

Untuk mendapatkan daftar aplikasi yang tidak ada dalam Gudang Terdaftar atau PPA, lakukan ini:

sudo apt-get install apt-show-versions
apt-show-versions | grep 'No available version'

Seharusnya menampilkan teks seperti ini:

app1 1.0.0.14 installed: No available version in archive
app23 0.3.6 installed: No available version in archive
app332 7.0.9377 installed: No available version in archive

Bagi saya ini berfungsi dan menunjukkan tiga aplikasi yang saya instal menggunakan paket DEB dan tidak tersedia dalam Repo atau PPA.

Namun ingat bahwa tidak mungkin untuk memeriksa semua program, hanya yang melewati dpkg. Misalnya, beberapa aplikasi diinstal dengan hanya mengekstraknya ke folder yang benar, atau yang lain menggunakan nampan atau skrip penginstal mandiri. Jadi cara terbaik adalah bagi Anda sendiri untuk menyimpan daftar aplikasi yang Anda instal melalui metode apa pun selain APT.

japzone
sumber
Bekerja untuk semua dpkgpaket lokal saya yang diinstal. Satu pengecualian. Ini daftar skype-bin, sedangkan apt-cache policy skype-binjelas menunjukkan repo mitra Canonical. Saya tidak yakin apa yang sedang terjadi. Masalah multiarch? Masih memberi +1 untuk apt-show-versions!
gertvdijk
aptitude menyebut paket-paket 'usang' ini. Lihat komentar kronis di atas.
Henk Poley
5

Jika Anda memiliki penggunaan aptitude diinstal,

aptitude search '?obsolete'

atau bentuk pendeknya

aptitude search '~o'

Ini dia contoh output

i A gcc-4.7-base - GCC, the GNU Compiler Collection (base package)
id  libdb4.7     - Berkeley v4.7 Database Libraries [runtime]
i   libudev0     - libudev shared library

Karakter pertama dari setiap baris menunjukkan kondisi paket saat ini. Keadaan yang paling umum adalah:

  • p, artinya tidak ada jejak paket yang ada pada sistem,
  • c, artinya paket itu dihapus tetapi file konfigurasinya tetap pada sistem,
  • i, artinya paket sudah diinstal, dan
  • v, artinya paket itu virtual.

Karakter kedua menunjukkan tindakan tersimpan yang dilakukan pada paket, jika ada, jika tidak, ruang kosong ditampilkan. Tindakan yang paling umum adalah:

  • i, artinya paket akan diinstal,
  • d, artinya paket akan dihapus, dan
  • p, artinya paket dan file konfigurasinya akan dihapus.

Jika karakter ketiga adalah A, paket itu diinstal secara otomatis.

Untuk daftar lengkap status dan tindakan yang mungkin dilakukan, lihat bagian Mengakses Informasi Paket di panduan referensi aptitude.

Demis Palma ツ
sumber
1
aptitude search ?obsoletedapat bekerja di bash, tetapi Anda harus menggunakanaptitude search '?obsolete'
AB
dapatkah Anda menambahkan beberapa detail pada parsing output?
Penatua Geek
Apakah 'usang' berbeda dari '~ o'?
Sean
@ Tidak, mereka tidak berbeda. ~ o apakah bentuk singkat untuk? usang memang.
Demis Palma ツ
Kutipan diuraikan oleh shell. Saya pikir apa yang dimaksudkan AB adalah Anda tidak boleh melewatkan karakter aneh yang tidak terhapus di baris perintah karena Anda tidak tahu apa yang akan dilakukan shell Anda dengan mereka.
Sean
2

Mulai dengan Ubuntu 19.10 juga dimungkinkan untuk dijalankan

apt list ?obsolete

untuk mendapatkan daftar paket usang.

Untuk rilis apa pun Anda bisa menggunakan Bash satu-liner berikut:

comm -23 <(dpkg-query -W -f '${db:Status-Abbrev}\t${Package}\n' | grep '^.[^nc]' | cut -f2 | sort) <(apt-cache dumpavail | sed -rn 's/^Package: (.*)/\1/p' | sort -u)

Tidak perlu menginstal paket tambahan untuk ini, plus ini relatif cepat. Ini juga akan menemukan paket yang terinstal sebagian (tetapi tidak akan menemukan mereka yang hanya memiliki file konfigurasi; yang dapat diubah dengan mudah, meskipun). Catatan: ini tidak peduli arsitektur apa paket-paket itu.

Jika Anda ingin menyertakan paket yang memiliki versi berbeda diinstal dari apa yang tersedia dari repositori, Anda dapat melakukan salah satu dari yang berikut:

Gunakan apt modern:

 apt list --installed | awk -F/ '/\[installed,local\]/{print $1}'

Namun pilihan lain adalah menjalankan

ubuntu-support-status --show-unsupported

dan baca nama paket di bagian "Tidak lagi dapat diunduh:".

jarno
sumber
'apt list --manual-instal | grep -v cosmic 'menunjukkan false positive. Jawaban ini jauh lebih baik!
TamusJRoyce
1
@TamusJRoyce, ya, saya kira begitu sekarang setelah mengedit.
jarno
1

Info lebih lanjut untuk diselidiki.

ubuntu-support-status 
paket echo "$ (sudo apt-mark showmanual | wc -l) yang ditandai sebagai 'diinstal secara manual'."

... ubuntu-support-status dan apt-mark mungkin memerlukan instalasi.

Hannu
sumber
Tidak perlu digunakan sudodengan apt-mark showmanual.
jarno
ubuntu-support-statusdaftar jumlah paket usang, tetapi bukan nama paket.
jarno
1
Baca outputubuntu-support-status --help
Hannu
Oh, terima kasih atas petunjuknya.
jarno
0

Mungkin ada cara yang lebih bersih, tetapi dari atas kepala saya dapat Anda lakukan

dpkg -l | cut -f 3 -d ' ' > installed
xargs -n 1 --replace=X apt-cache search ^X$ < installed | cut -f 1 -d ' ' > available
diff installed available

Bersihkan beberapa baris pertama installedfile: itu akan memiliki header.

Bonus jika ada yang dapat memperbaiki sorotan sintaksis saya ...

Jeff Ferland
sumber
2
jika Anda akan menggunakan output dpkg -luntuk mendapatkan daftar paket yang diinstal, Anda harus membatasi hasilnya pada baris dengan 'i' di kolom kedua, karena dpkg juga akan mencantumkan paket yang tidak diinstal (mungkin dihapus tetapi tidak dibersihkan) . sebagai contoh, mengubah perintah pertama Anda menjadi dpkg -l | grep '^.[^i]' | cut -f 3 -d ' ' itu akan mengembalikan daftar paket, yang TIDAK diinstal. (tapi dulu)
rebus
1
juga, apt-cache search someinstalledpackageakan mengembalikan sesuatu bahkan jika paket tidak tersedia dari repo, jadi saya tidak percaya ini akan berhasil sama sekali.
rebus
1
@stew, saya akan meninggalkan ini di sini untuk melihat apakah ada yang mencapai kesimpulan, tetapi jawaban Anda pasti jauh lebih baik. Memberi +1 kepada Anda.
Jeff Ferland
@stew dpkg -l | grep '^.[^i]' | cut -f 3 -d ' 'juga mencetak beberapa baris tajuk.
jarno
Bahkan jika jawaban ini berhasil, akan sangat lambat karena akan berjalan apt-cache searchuntuk setiap paket secara terpisah.
jarno
0

Seperti disebutkan pencarian apt-get bukanlah metode yang baik untuk memeriksa apakah suatu paket masih tersedia. Tambahan saya telah menambahkan semuanya hanya dalam satu baris:

for i in `dpkg -l | grep '^i' | awk '{ print $2 }'`; do apt-cache show $i > /dev/null || echo $i; done
wof
sumber
Dan mengapagrep '^i'
AB
@ AB poin bagus; itu tidak memberi tahu, jika paket diinstal, tetapi bahwa tindakan paket yang diinginkan harus diinstal. Lihat man dpkg-queryuntuk informasi lebih lanjut.
jarno
Ini sangat lambat
jarno
apt-cache showtidak baik untuk memeriksa apakah paket tersebut tersedia. Jika Anda menonaktifkan repositori masing-masing, dan tidak ada repositori lain yang diaktifkan, repositori tersebut masih menampilkan paket tersebut.
jarno