Bash geçmişinden son N satırını sil


40

Yanlışlıkla bir dosyayı kabuğun içine yapıştırırken, bash geçmişine bir sürü çirkin saçma girdi koyar. Bu girdileri kaldırmanın temiz bir yolu var mı? Açıkçası kabuğu kapatıp .bash_historydosyayı el ile düzenleyebilirim ama belki mevcut kabuğun geçmişini değiştirebilecek bir çeşit API var mı?

Yanıtlar:


36

Sen kullanabilirsiniz history -d offsetgeçerli kabuk tarihinin belirli bir çizgiyi silmek için yerleşik veya history -cbütün geçmişini temizlemek.

Bir dizi satırı kaldırmak istiyorsanız pratik değil, çünkü argüman olarak sadece bir ofset alır, ancak onu bir döngü ile bir fonksiyona sarabilirsiniz.

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

İle ara rmhist first_line_to_delete last_line_to_delete. (Çıktısına göre satır numaraları history.)

( history -wTarih dosyasına dosya yazmaya zorlamak için kullanın .)


1
OP son N satırlarını silmek istediğinden , bu komut dosyası şunun gibi bir şey yapılarak değiştirilmeli tot_lines=$(history | wc -l)ve sonra tekrar edilmelidir history -d $(( tot_lines - $1 )).
PlasmaBinturong

2
Bunun yerine, kullanılabilecek $(history | wc -l)değişken $HISTCMDvar.
PlasmaBinturong

28

Komut isteminde sadece bu bir liner yardımcı olacaktır.

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

START_NUM'un tarihe giriş pozisyonunun başladığı yer N silmek isteyebileceğiniz giriş sayısıdır.

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


3
Bunun neden yerleşik bir işlev olmadığını merak ediyorum. 'tarihçe' çok eski bir araçtır.
Petr Gladkikh

amaca çok iyi hizmet eder, ancak bu komut tarihte görülebilir :)
Rajeev Akotkar

askubuntu.com/a/978276/22866 "tarih komutundan sil" geçmişini silmek için güzel bir yola sahip :-)
HanSooloo

0

User2982704 tarafından cevap neredeyse benim için çalıştı ama tam olarak değil. Bunun gibi küçük bir değişiklik yapmak zorunda kaldım.

Geçmişimin 1000 olduğunu varsayarak son 50 girişi silmek istiyorum.

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.