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


15

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

apt-get remove foo bar baz

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

scapegoatが実際にインストールされたパッケージを削除するためにcups-dbgを使用して、私が試したがうまくいかなかったこと:

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魔法を使用してこれを実行できることは知っていますが、絶対に必要な複雑さは避けたいと思います。


この答えは最終的に私のために働いた。愚かな問題の愚かな修正。実際、Launchpadにはこれに関する欠陥があるので、気軽に貢献してください。
ジェフ

回答:


8

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

1
削除するパッケージには逆の依存関係がある可能性があることを述べておかなければならず、それらも削除したいです。したがって、Apt-getはdpkgよりもはるかに優れていますが、実際にはこれを行うより良い方法はないと思われるので、あなたの答えを受け入れます。
javawizard

7

パッケージのリストに従って、依存関係に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

3

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

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}')

OK。時々、bogus-packageちょうど間違った名前を持っていました。したがって、500個のパッケージがあった場合、偽のパッケージも分析し、いくつかのトリック(たとえば、不足している名前の後ろにある数字など)を行う方がよいでしょう。 ..
nyxee

@nyxee私はこれを新しい質問として尋ね、あなたが達成したいことを正確に指摘することを提案します。
vog

1
これは、1)Ubuntu 18.04にaptitudeがデフォルトでインストールされなくなり、2)aptitudeがワイルドカードを処理するためのかなり異なる(奇妙な言い方をする)方法を除いて、良い回避策になります。
ジェフ

これはDebian 10で機能していません。Couldn't find any package whose name or description matched 'QUX' Unable to apply some actions, aborting
そうですね

@ pdoherty926ヒントをありがとう。これを確認し、それに応じて答えを調整しました。
vog

0

誰かがaptを使用する必要がある場合は、もう1つの小さな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!

SuperUserへようこそ!あなたのスクリプトが何をするのか、そしてそれがどのようにそれを行うのかについて、あなたの答えにさらに説明を加えますか?
El8dN8

@ El8dN8を追加しましたexplination
メイア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.