web-dev-qa-db-ja.com

「apt-getremove」を使用するときに現在インストールされていないパッケージを無視する

インストールされているかどうかわからないパッケージのセットを削除したいというシナリオがあり、apt-getでインストールされているパッケージを削除し、インストールされていないパッケージを黙って無視したいと思います。何かのようなもの:

apt-get remove foo bar baz

これは、fooとbarがインストールされているが、bazがインストールされていない場合、bazについて文句を言わずにfooとbarを削除します。これを行う方法はありますか?

私が試したものはうまくいきませんでした。cups-dbgをscapegoatとして実際にインストールしたパッケージを削除しました。

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

シェルスクリプトといくつかのdpkg --list魔法ですが、絶対に必要というわけではない複雑さは避けたいと思います。

15
javawizard

dpkgなどの下位レベルのツールへのフォールバックはオプションですか?

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

パッケージ構成ファイルを削除するには、以下のようにパージを使用します

dpkg --purge foo bar libperl-dev
8
barti_ddu

私が使う apt-get remove --purge(別名apt-get purge)パッケージのリストに続く依存関係。存在しないパッケージを処理するには、次のスクリプトでインストールされていないパッケージを除外します。

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

Debian≤9の場合、apt-getの代わりにaptitudeを使用することができます。

Sudo aptitude remove -y cups-dbg bogus-package

Aptitudeは警告を出力しますが、それでもパッケージを削除し続けます:

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

削除(構成ファイルの保持)ではなくパージ(パッケージ構成ファイルの削除)を行う場合は、aptitudeは直接指定されたパッケージのみをパージし、未使用の依存関係は削除されるだけであることに注意してください。ただし、次の2番目の手順で、削除されたすべてのパッケージを削除できます。

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

誰かがaptを使用する必要がある場合の別の小さな2ライナー:

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
}

説明:

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!
0
Meir