インストールされているかどうかわからないパッケージのセットを削除したいというシナリオがあり、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
魔法ですが、絶対に必要というわけではない複雑さは避けたいと思います。
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
私が使う 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
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}')
誰かが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!