bash履歴から最後のN行を削除します


40

誤ってファイルをシェルに貼り付けると、大量のいナンセンスエントリがbash履歴に追加されます。これらのエントリを削除するクリーンな方法はありますか?明らかに、シェルを閉じて.bash_historyファイルを手動で編集できますが、現在のシェルの履歴を変更するために利用可能なAPIがあるのでしょうか?

回答:


36

history -d offsetbuiltinを使用して、現在のシェルの履歴から特定の行を削除したりhistory -c、履歴全体をクリアしたりできます。

ある範囲の行を削除したい場合、実際には実用的ではありません。引数として1つのオフセットしか取らないので、ループを使用して関数にラップすることができます。

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

で呼び出しrmhist first_line_to_delete last_line_to_deleteます。(の出力に応じた行番号history。)

history -w履歴ファイルへの書き込みを強制するために使用します。)


1
OPはNの削除を求めたので、最後の行を、このスクリプトのような何かを行うことによって変更する必要がありますtot_lines=$(history | wc -l)し、その後繰り返しhistory -d $(( tot_lines - $1 ))
PlasmaBinturong

2
の代わりに$(history | wc -l)$HISTCMD使用できる変数があります。
PlasmaBinturong

29

コマンドプロンプトでこの1つのライナーだけが役立ちます。

for i in {1..N}; do history -d START_NUM; done

START_NUMは、履歴のエントリの開始位置です。Nは、削除するエントリの数です。

例: for i in {1..50}; do history -d 1030; done


3
なぜこれが既に組み込み関数ではないのだろうか。「履歴」は非常に古いツールです。
ペトルグラドキフ

目的を非常にうまく果たしますが、このコマンドは歴史で見ることができます:)
ラジェエフアコトカー

askubuntu.com/a/978276/22866には、「履歴から削除」コマンドを履歴から削除する便利な方法があります:-)
HanSooloo

0

user2982704による答えは、私にとってはほとんど機能しましたが、まったくそうではありませんでした。このような小さなバリエーションを作成する必要がありました。

私の履歴が1000であり、最後の50エントリを削除すると仮定します

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.