“Apt-get remove” kullanılırken şu anda yüklü olmayan paketleri yoksay


15

Yüklenebilecek veya yüklenmeyecek bir paket kümesini kaldırmak istediğim bir senaryom var ve olmayanları kaldırmak ve sessizce olmayanları görmezden gelmek istiyorum. Gibi bir şey:

apt-get remove foo bar baz

foo ve bar kurulmuş ancak baz olmasaydı, bazdan şikayet etmeden foo ve bar'ı kaldıracaktı. Bunu yapmanın bir yolu var mı?

Çalıştığım şeyler, scapegoat'ım aslında yüklü olan paket olarak cups-dbg ile kaldırılacak:

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

Bunu bir kabuk senaryosu ve biraz dpkg --listsihirle yapabileceğimi biliyorum , ama kesinlikle gerekli olmayan herhangi bir karmaşıklıktan kaçınmak istiyorum.


Bu cevap sonunda benim için çalıştı . Aptal bir sorun için aptalca düzeltme. Launchpad'de bununla ilgili bir kusur olduğunu unutmayın, bu yüzden katkıda bulunmaktan çekinmeyin.
Jeff

Yanıtlar:


8

Dpkg gibi alt düzey araçlara geri dönmek bir seçenek midir?

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 ...

Paketler yapılandırma dosyalarını kaldırmak için aşağıdaki gibi temizleme kullanın

dpkg --purge foo bar libperl-dev

1
Kaldırılacak paketlerin ters bağımlılıkları olabileceğinden bahsetmeliydim ve bunların da kaldırılmasını istiyorum. Apt-get bu nedenle dpkg'dan çok daha iyidir, ancak cevabınızı kabul edeceğim çünkü bunu yapmanın gerçekten daha iyi bir yolu yok gibi görünüyor.
javawizard

7

Bir paket listesi ile bağımlılık için apt-get remove --purge(aka apt-get purge) kullanıyorum . Var olmayan paketleri işlemek için, aşağıdaki komut dosyasıyla yüklenmeyen paketleri filtreliyorum.

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

3

Debian ≤ 9 için, sadece aşağıdakiler aptitudeyerine kullanmak mümkündür apt-get:

sudo aptitude remove -y cups-dbg bogus-package

Aptitude uyarıları yazdırır, ancak yine de paketlerinizi kaldırmaya devam eder:

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

Kaldırmak (yapılandırma dosyalarını saklamak) yerine temizlemek (paket yapılandırma dosyalarını silmek) istiyorsanız, aptitudeyalnızca doğrudan verilen paketleri temizlerken kullanılmayan bağımlılıklar kaldırılır. Ancak, kaldırılan tüm paketleri ikinci bir adımda temizleyebilirsiniz:

apt-get -y purge $(dpkg -l | grep ^rc | awk '{print $2}')

tamam. bazen bogus-packageyanlış isme sahipti. yani, 500 paket gibi olsaydı, sahte paketleri de analiz etmek ve bazı hileler yapmak daha iyi olurdu (örneğin, eksiklik adından sonra rakamlar, vb.). ..
nyxee

@nyxee Bunu tam olarak neye ulaşmak istediğinizi göstererek yeni bir soru olarak sormayı öneriyorum.
vog

1
Bu güzel bir geçici çözüm olabilir 1) yetenek artık varsayılan olarak Ubuntu 18.04 ve 2'de yüklü değil) yetenek joker karakterleri işlemek için oldukça farklı (biri garip diyebilir) bir yol var.
Jeff

Bu benim için Debian 10'da çalışmıyor. Anladım,Couldn't find any package whose name or description matched 'QUX' Unable to apply some actions, aborting
pdoherty926

@ pdoherty926 İpucu için teşekkürler. Bunu doğruladım ve cevabımı buna göre ayarladım.
vog

0

Herkesin apt kullanmaya ihtiyacı varsa başka bir küçük 2-astar:

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
}

explination:

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!

SuperUser'a hoş geldiniz! Komut dosyanızın ne yaptığı ve nasıl yaptığı hakkında cevabınıza daha fazla açıklama ekler misiniz?
El8dN8

@ El8dN8 Ek açıklama
Meir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.