web-dev-qa-db-ja.com

古いカーネルを削除するこのコマンドは安全に使用できますか?

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にとって困難な多数の/|\*、および^文字を含んでいます。

私はインターネットで見つけることができなかったこのコマンドのステップバイステップの翻訳と説明を探しています!

21
Bhavesh Diwan

私は言うだろう:現在のフォームで使用しないでください

  1. それはあなたに尋ねることなく変更を行います。 apt-get -y purge部分により、ワンライナーは確認なしでパッケージの削除を実行できます。スクリプトにエラーが存在する場合、ねじ込みである可能性があります。

  2. ソースも著者も指定されていません。そのソースはここで違いを生みます。徹底的にテストされたシステムパッケージに由来する場合は、そのテストを追跡できます。ランダムなソースから、それを信頼することはできません。

  3. dpkg -lSudoなしで正常に動作します。元の著者がこれが必要だと思った理由がわかりません。

常識を使う

有害な部分を削除し、ルートとして実行されるものはすべて除外します。

たとえば、次のように切り詰めます。

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]は、(引数として)指定されたパッケージをパージ(すべて削除)します。

代替案

このことについては、おそらくかなりの質問がすでに聞かれているでしょう。これまでに見つけた関連するもの:

27
gertvdijk

あなたはステップバイステップの説明を求めたので、ここに行きます:

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構文をどれだけ理解しているかに依存します。そして、これらのトピックの両方に関する本全体があります。

7
chaskes

まず、コマンドを分析し、それぞれのmanページを読みました。

  • dpkg -l:パッケージをリストするため、dpkg -l linux-*linux-(通常はカーネル)で始まるすべてのパッケージをリストします。

  • seddpkg -l linux-*の出力は、sedがデコードするいくつかの正規表現でsedにパイプされます。

  • uname -runameシステム情報を印刷

uname-システム情報を出力します

-rハンドルは、特にカーネルリリースを出力します。

-r、--kernel-releaseカーネルリリースを出力します

uname -rの出力は、さらに正規表現を使用してsedにパイプされ、その出力はxargsに渡されます

xargssed出力をパッケージ名に変換し、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'  

これがスクリーンショットです:

enter image description here

すべての古いカーネルバージョンiirc。

6
Seth