apt(または他のツール)を使用してインストールまたは削除するさまざまなパッケージ(特にカーネル関連パッケージ)を選択する簡単な方法はありますか?
現在私は古いカーネルを削除しようとしていますapt remove linux-\*-4.4.0-{40..80}-\*
。
これにより、削除したいパッケージが正しく選択されますが、以下のフォームのエラーによってプロセスがすぐに中断されますE: Couldn't find any package by glob 'linux-*-4.4.0-65-*'
。
実際、この正規表現に対応するパッケージはありませんが、これは警告の代わりにエラーが発生するという事実にかなり驚きました。結局のところ、空のパッケージセットを削除するのは簡単です!
ベストアンサー1
これは次の方法で行うことができます。コマンドの置き換え。たとえば、
apt-get remove $(dpkg -l 'linux-*' | awk '/-4.4.0-([4-7][0-9]|80)-/ { print $2}')
またはすでにdlocate
インストールされている場合:
apt-get remove $(dlocate -k | grep -E -- '-4.4.0-([4-7][0-9]|80)-')
関連する解決策とは異なり、xargs
コマンド置換はstdinファイル記述子を変更しないため、apt-get
apt-getは通常どおり入力を受け取ることができます(例:debconf質問への回答)。 xargs
標準入力から独自の入力を取得するため、対話型プログラム、つまり標準入力の入力を必要とするプログラムと一緒に使用しないでください。
使用する前に、apt-get
問題xargs
が発生していないことを確認する必要があります。たとえば、次のようになります。
export DEBIAN_FRONTEND=noninteractive
dlocate -k | grep -- -4.4.0- | xargs apt-get remove -y
注dlocate
:この-k
オプションは、インストールされているすべてのカーネルとdkms関連のパッケージを1行に1つずつ一覧表示します(-K
同じことはしますが、詳細なdpkg -L
形式で表示されます)。この使い方を可能にする-k
オプションを追加しましたが、dlocate
これまでは、その後にオプションの正規表現パラメータが必要であるという考えはまったくありませんでした。-k
完全に明白であるにもかかわらず、私はいつもgrep
。
次のバージョンdlocate
(例:1.08以降)では、dlocate -k '-4.4.0-'
出力パイピングなしでこれをサポートしますgrep
。