Abaikan paket yang saat ini tidak diinstal ketika menggunakan "apt-get remove"

15

Saya memiliki skenario di mana saya ingin menghapus satu set paket yang mungkin atau mungkin tidak diinstal, dan saya ingin apt-get untuk menghapus yang ada dan diam-diam mengabaikan yang tidak. Sesuatu seperti:

apt-get remove foo bar baz

yang, jika foo dan bar diinstal tetapi baz tidak, akan menghapus foo dan bar tanpa mengeluh tentang baz. Apakah ada cara untuk melakukan ini?

Hal-hal yang saya coba tidak berhasil, dengan cups-dbg sebagai paket kambing hitam saya yang sebenarnya diinstal untuk dihapus:

jcp@a-boyd:~$ sudo apt-get remove -y cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

jcp@a-boyd:~$ sudo apt-get remove --ignore-missing cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

jcp@a-boyd:~$ sudo apt-get remove --fix-broken cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

Saya tahu saya bisa melakukan ini dengan skrip shell dan dpkg --listsihir, tetapi saya ingin menghindari kerumitan yang tidak mutlak diperlukan.

javawizard
sumber
Jawaban ini berhasil bagi saya pada akhirnya. Memperbaiki bodoh untuk masalah bodoh. Perhatikan bahwa sebenarnya ada cacat pada Launchpad tentang hal ini sehingga merasa bebas untuk berkontribusi.
Jeff

Jawaban:

8

Apakah kembali ke alat level bawah seperti dpkg merupakan pilihan?

dpkg --remove foo bar libperl-dev
dpkg: warning: ignoring request to remove foo which isn't installed
dpkg: warning: ignoring request to remove bar which isn't installed
(Reading database ... 169132 files and directories currently installed.)
Removing libperl-dev ...

Untuk menghapus paket, konfig menggunakan file purge seperti di bawah ini

dpkg --purge foo bar libperl-dev
barti_ddu
sumber
1
Saya seharusnya menyebutkan bahwa paket-paket yang akan dihapus dapat memiliki dependensi terbalik, dan saya ingin mereka juga dihapus. Karena itu, Apt-get jauh lebih baik daripada dpkg, tetapi saya akan menerima jawaban Anda karena tampaknya tidak ada cara yang lebih baik untuk melakukan ini.
javawizard
7

Saya menggunakan apt-get remove --purge(alias apt-get purge) untuk dependensi berikut dengan daftar paket. Untuk menangani paket yang tidak ada, saya memfilter paket yang tidak diinstal dengan skrip berikut.

pkgToRemoveListFull="cups-dbg bogus-package"
pkgToRemoveList=""
for pkgToRemove in $(echo $pkgToRemoveListFull); do
  $(dpkg --status $pkgToRemove &> /dev/null)
  if [[ $? -eq 0 ]]; then
    pkgToRemoveList="$pkgToRemoveList $pkgToRemove"
  fi
done
apt-get --yes --purge remove $pkgToRemoveList
Lucas
sumber
3

Untuk Debian ≤ 9, dimungkinkan untuk hanya menggunakan aptitudealih-alih apt-get:

sudo aptitude remove -y cups-dbg bogus-package

Aptitude mencetak peringatan, namun tetap menghapus paket Anda:

Couldn't find any package whose name or description matched "bogus-package"
...
Removing cups-dbg ...
...

Jika Anda ingin membersihkan (menghapus file konfigurasi paket) daripada menghapus (menyimpan file konfigurasi), perhatikan bahwa aptitudehanya membersihkan paket yang diberikan secara langsung, sedangkan dependensi yang tidak digunakan hanya dihapus. Namun, Anda dapat membersihkan semua paket yang dihapus di langkah kedua:

apt-get -y purge $(dpkg -l | grep ^rc | awk '{print $2}')
vog
sumber
baik. kadang-kadang, bogus-packagehanya saja memiliki nama yang salah. jadi, jika kita memiliki sekitar 500 paket, akan lebih baik untuk menganalisis paket palsu juga dan melakukan beberapa trik (misalnya, nomor setelah nama yang kurang, dll. jadi, bisakah Anda memberikan petunjuk tentang cara melakukan ini ..
nyxee
@ nyxee Saya mengusulkan untuk mengajukan ini sebagai pertanyaan baru, menunjukkan dengan tepat apa yang ingin Anda capai.
vog
1
Ini akan menjadi solusi yang bagus kecuali 1) aptitude tidak lagi diinstal secara default pada Ubuntu 18.04 dan 2) aptitude memiliki cara yang cukup berbeda (bisa dikatakan aneh) untuk menangani wildcard.
Jeff
Ini tidak bekerja untuk saya pada Debian 10. Saya mengerti,Couldn't find any package whose name or description matched 'QUX' Unable to apply some actions, aborting
pdoherty926
@ pdoherty926 Terima kasih atas petunjuknya. Saya memverifikasi ini dan menyesuaikan jawaban saya.
vog
0

2-liner kecil lain jika ada yang perlu menggunakan apt:

purge_packages () {
  matchedPackages="$(echo "$(apt list --installed $* 2>/dev/null)" | grep -v '^Listing\.\.\.' | sed -s 's|[/ ].*||' | tr '\n' ' ' | sed 's/ *$//;s/^ *//')"
  [[ -n "$matchedPackages" ]] && apt purge -yq $matchedPackages
}

Penjelasan:

apt list --installed $*         # Lists packages matched from function args, the --installed flag limits results to installed packages

2>/dev/null                     # Disregard the warning about using this command in a script

grep -v '^Listing\.\.\.'        # Remove the first line of output that says "Listing..." or "Listing... Done"

sed -s 's|[/ ].*||'             # Remove the rest of the line after the package name (I'm checking for / or space though it looks like just the slash is needed but package names will never have a space)

tr '\n' ' '                     # Put it all on one line separated by spaces

sed 's/ *$//;s/^ *//'           # Remove trailing and leading spaces from the line so it will be blank during the test next line if nothing was matched

[[ -n "$matchedPackages" ]]     # Check if any packages were matched

apt purge -yq $matchedPackages  # Purge them!
Meir
sumber
Selamat datang di SuperUser! Apakah Anda menambahkan lebih banyak deskripsi ke jawaban Anda tentang apa yang dilakukan skrip Anda, dan bagaimana skrip melakukannya?
El8dN8
@ El8dN8 Menambahkan eksplorasi
Meir