Ubuntuの記事をインターネットで閲覧しているときに、次のコマンドに出会いました。
Sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs Sudo apt-get -y purge
著者は、これはLinuxの以前のバージョンをすべて削除し、現在のバージョンのみを残す!
私は実際にそのようなコマンドを探していますが、これがどれほど安全かはわかりません。知りたい:
自分ですべてを推測しようとすると、非常に混乱してイライラします。このコマンドがどのように機能するかは、Googleにとって困難な多数の/
、|
、\
、*
、および^
文字を含んでいます。
私はインターネットで見つけることができなかったこのコマンドのステップバイステップの翻訳と説明を探しています!
それはあなたに尋ねることなく変更を行います。 apt-get -y purge
部分により、ワンライナーは確認なしでパッケージの削除を実行できます。スクリプトにエラーが存在する場合、ねじ込みである可能性があります。
ソースも著者も指定されていません。そのソースはここで違いを生みます。徹底的にテストされたシステムパッケージに由来する場合は、そのテストを追跡できます。ランダムなソースから、それを信頼することはできません。
dpkg -l
はSudo
なしで正常に動作します。元の著者がこれが必要だと思った理由がわかりません。
有害な部分を削除し、ルートとして実行されるものはすべて除外します。
たとえば、次のように切り詰めます。
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'
もののみを出力するを実行し、通常のユーザー権限でを実行します。これらのカーネルを削除することに同意したら、自分でappend| xargs Sudo apt-get purge
できます。意図的に-y
オプションがないため、システムに加えられる変更について確認を求められます。
dpkg -l
すべてのパッケージのリストを出力します。この場合、パッケージはstartingを名前としてlinux-
のみでリストします。|
(パイプ)は、左側のコマンドの出力(これをstdout
と呼びます)を右側のコマンドの入力(これをstdin
と呼びます)にパイプします。sed
は、正規表現を使用して文字列を操作するツールです。この場合、インストールされたパッケージのパイプとフィルターの左側のコマンドの出力を操作します(ii
で指定されたdpkg
に依存します)。この場合、ネストされています。ここでsed
の使用全体を説明するのは、複雑な正規表現では使用が非常に複雑であるため、非常に困難です。 (\(.*\)-\([^0-9]\+\)"
は正規表現の例です。\1
は、ある種の汎用的な検索と置換を行うための置換参照です(1
で最初の「ヒット」を参照)。正規表現自体は害を及ぼしません。ただし、入力を誤った方法で操作した場合、間違ったパッケージを削除したり、シェルインジェクションを実行したりすることができます。この場合、uname -r
によって提供されるバージョンに基づいてカーネルパッケージの名前を見つける方法のように見えます。uname -r
は、実行中のカーネルの現在のバージョンを出力します。xargs
は、コマンドの引数としてパイプの左側の入力行を追加します。この場合、各行のカーネルバージョンは、スペースで区切られた水平方向のリストに変換され、Sudo apt-get
コマンドに追加されます。Sudo apt-get -y purge [packagename]
は、(引数として)指定されたパッケージをパージ(すべて削除)します。このことについては、おそらくかなりの質問がすでに聞かれているでしょう。これまでに見つけた関連するもの:
この答え から、次のコマンドはより安全でより一般的な方法で同じことをするようです:
Sudo apt-get purge $( dpkg --list | grep -P -o "linux-image-\d\S+" | grep -v $(uname -r | grep -P -o ".+\d") )
あなたはステップバイステップの説明を求めたので、ここに行きます:
Sudo dpkg -l 'linux-*'
パッケージ名にlinux-
で始まるパッケージをリストします
| sed
リストをsed
にパイプします
"s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'
非常に複雑な正規表現を使用してリストを編集します
| xargs
これにより、新しいリストがxargs
にパイプされ、引数としてリストが送信されます
Sudo apt-get -y purge
気が変わる機会を与えずにこれらのパッケージを削除します。
または、そのリストをパージコマンドに送信し、そのままにしておくと言う方が正確かもしれません。パージされるかどうか、そして重要なことは、正確にパージされるものは、前のコマンドの出力に依存します。
安全ですか?この場合、すべては、あなたが見つけた投稿の著者が正規表現とsed
構文をどれだけ理解しているかに依存します。そして、これらのトピックの両方に関する本全体があります。
まず、コマンドを分析し、それぞれのman
ページを読みました。
dpkg -l
:パッケージをリストするため、dpkg -l linux-*
はlinux-
(通常はカーネル)で始まるすべてのパッケージをリストします。
sed
:dpkg -l linux-*
の出力は、sed
がデコードするいくつかの正規表現でsed
にパイプされます。
uname -r
uname
システム情報を印刷
uname-システム情報を出力します
-r
ハンドルは、特にカーネルリリースを出力します。
-r、--kernel-releaseカーネルリリースを出力します
uname -r
の出力は、さらに正規表現を使用してsed
にパイプされ、その出力はxargs
に渡されます
xargs
はsed
出力をパッケージ名に変換し、Sudo apt-get purge -y
に渡します。これはすべてのプロンプトに対して自動的に「yes」と応答します。
-y、-yes、-assume-yesプロンプトに対する自動yes;すべてのプロンプトに対する答えとして「はい」を想定し、非対話的に実行します。保留されたパッケージの変更、認証されていないパッケージのインストール、または重要なパッケージの削除などの望ましくない状況が発生した場合、apt-getは中止されます。構成アイテム:APT :: Get :: Assume-Yes。
完全にこのコマンドwillのようになりますが、sed
の正規表現を翻訳する必要があることを確実にするために、必要なことを実行してください。
私はちょうど走った:
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'
これがスクリーンショットです:
すべての古いカーネルバージョンiirc。