Seçili sonuçlar bash tarihinden nasıl silinir?


66

historykomut tüm sonuçları gösterir, ancak kullanarak belirli bir komutu almak için filtre uygulayabiliriz history | grep searchingCommand. Gerçekten çok yardımcı oldu.

Ancak sorun, yazım hatasıyla girilen veya başarısız olan komutları da göstermesidir. O zaman doğru olanı tanımlamak gerçekten acı vericidir. Bu bağlantıyı kontrol ettim: Terminalde seçici komut geçmişi? ama bu benim çözümüm değildi.

Öyleyse, bu komutları girilen tarihte veya sonrasında yanlış olan tarihçeden silmenin bir yolu var mı?


5
Lütfen kabul edilen cevabı değiştirin, 100'den fazla oy alan başka bir tane daha var.
greuze

1
@greuze: En iyi cevaba göre değiştirildi. Oy sayısı en iyisi olduğu anlamına gelmez!
Saurav Kumar

Yanıtlar:


20

Ben bash ile çalışırken oldukça kazara bulduğum, geçmiş girişlerini değiştirmek (veya silmek) için başka bir yöntem eklemek istiyorum:

Bunu göstermek için, bash'de aşağıdaki üç komutu çalıştırarak başlayın:

$ echo 1
1
$ echo 2
2
$ echo 3
3

Şimdi bu komutları tekrar ok tuşlarını veya Ctrl+ pve Ctrl+ tuşlarını kullanarak seçebilirsiniz n.

İlk iki komutu değiştirmek istediğinizi söyleyin. Görünene kadar tarih boyunca ilerleyin echo 1ve değiştirin echo 1 - changed, ancak ENTER tuşuna BASMAYIN. Şimdi geçmişinizde daha ileriye doğru ilerlerseniz, bu çizgi değiştirilmiş durumda kalır ve bundan geriye ve geriye gidebilirsiniz. Şimdi çizgiye gidin echo 2ve değiştirin echo 2 - changed, tekrar enter tuşuna basmayın. Değişiklikleri bu satırlara kaydetmek için, tarihte bu ikisi hariç herhangi bir komutu seçin ve Ctrl+ tuşlarına basın c.

Elbette, geçmiş girişini değiştirmek yerine, girişi de boş bir satırla sonuçlanacak şekilde de kaldırabilirsiniz. Komut isteminde görüntülenen satırı silmek için, Ctrl+ e(satırın sonuna atlar) ve ardından Ctrl+ u(satırın başlangıcından imleci silen metni silen) tuşuna basın.

Ayrıca bkz https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-be-deleted-from-my-bash-history/195726#195726 daha ayrıntılı bir açıklama için teknik arka plan.

En Kolay Yol:

  1. ctrl+ rsilmek / değiştirmek istediğiniz komutu aramak için.
  2. end silinecek / değiştirilecek aranan komutu seçmek için
  3. Seçilen komutu silin veya değiştirin ( enterveya ctrl+ tuşlarına basmayın c)
  4. başka bir komut seçmek için yukarı ok (veya ctrl+ p) veya aşağı ok (veya ctrl+ n).
  5. ctrl+ c İşte bu!

Not :

Bu, yalnızca geçerli oturum komutlarını değiştirir. Eski komutları değiştirmek ve değişiklikleri kaydetmek istiyorsak, terminali kapatmadan önce aşağıdaki komutu çalıştırmamız gerekir:

history -w

Çok teşekkürler Stefan! Harika şeyler getirdiğini söylemeliyim. Bunu kullanarak geçmişi değiştirmek / silmek için en basit yolu buldum: 1.ctrl+r silmek / değiştirmek istediğiniz komutu aramak için. 2.end komutu taşımak ve komutu silmek / değiştirmek için. 3. birctrl+n sonraki satıra geçmek ve daha sonra 4.ctrl+c
Saurav Kumar

144

kullanın:

history -d OFFSET

tarihin girişini, OFFSETbash geçmiş dosyanıza eklenmeden önce bile ofset olarak silmek için . Doğru olanı bulmak için OFFSETyalnızca historykomutu çalıştırmanız gerekir . Silmek istediğiniz geçmiş girdisini içeren satırın başındaki sayıdır.

Değişiklikleri tarihçeye kaydetmek için:

history -w

Bu kılavuzdaki daha fazla ayrıntıya bakın .


fena değil :) Yeni bir yol almak güzel ..
Saurav Kumar

10
@SauravKumar Fena değil?!? Muhtemelen en iyi yoldur ...
Radu Rădeanu

5
İLK OKUYUN: Sadece açık olması history -wiçin değişiklikleri kaydetmek için şifreleri yapmanız gerekir . Ayrıca OFSET, hangi rakamın historygörüntüleneceği anlamına gelir . Silmeye çalıştığınız satır 873 ise, kullanın history -d 873.
Cammy_the_block

2
@ RaduRădeanu Değişiklikleri kaydetmek için history -wsonra düğmesini kullanın history -d.
Cammy_the_block

20
Bu doğru cevap olmalı.
topher

19

Dosyayı düzenleyin ~/.bash_historyve bir kez yazım hatası ile silin

Örneğin, bu komutu ekleyin:

gedit ~/.bash_history

İstediğiniz ve sonrasında bir dosyayı düzenleyin ve dosyayı kaydedin ve terminali yeniden başlatın. Kök komutu:

sudo -i 
inser your password
gedit ~/.bash_history

hepsini silmek istiyorsanız history -chile yapmanız gerekir


SÖZDİZİMİ

history
history [n]
history -c
history -d offset
history [-anrw] [filename]
history -ps arg

ANAHTAR

-c Geçmişi temizle. Bu, geçmiş listesini tamamen değiştirmek için diğer seçeneklerle birleştirilebilir.

-d ofset Konum ofsetindeki geçmiş girişini siler. geçmiş görüntülendiğinde göründüğü gibi ofset belirtilmelidir.

-a Yeni geçmiş satırlarını (geçerli Bash oturumunun başlangıcından beri girilen tarih satırları) geçmiş dosyasına ekleyin.

-n Geçmiş dosyasından henüz okumadığınız tarih satırlarını geçerli geçmiş listesine ekleyin. Bunlar, geçerli Bash oturumunun başlangıcından beri geçmiş dosyasına eklenen çizgilerdir.

-r Geçerli tarih dosyasını okuyun ve içeriğini tarih listesine ekleyin.

-w Mevcut geçmişi tarih dosyasına yaz.

-p Args üzerinde tarih değiştirme işlemini yapın ve sonuçları geçmiş listesine kaydetmeden sonuçları standart çıktıda görüntüleyin.

-S Args, tarih listesinin sonuna tek bir giriş olarak eklenir.

kaynak :


Teşekkürler yardımcı olur! Komut satırından girildiğinde girişin nasıl silineceğini biliyor musunuz? Veya girişi açmadan silmek için herhangi bir komut var .bash_historymı?
Saurav Kumar

1
@ bladed19899 history -cçalışmıyor Terminali kapatıp tekrar açtığımda geçmişler silinmiyor. -1 cevabınız
αғsнιη 14:14

1
@KasiyA, -c Clear the history list. This may be combined with the other options to replace the history list completely. kaynak
blade19899

2
@KasiyA Değişiklikleri yazdıktan history -wsonra kullanın history -c.
Cammy_the_block

16

Hemen aynı terminalden silmek istiyorsanız, önce ~ / .bashrc dosyasına şunu eklemelisiniz.

PROMPT_COMMAND='history -a' 

ve terminalinizi yeniden başlatın .

Herhangi bir yere .bashrc dosyasında ekleyebilirsiniz. Ben diğer tarih ile ilgili şeyler ile birlikte aşağıdaki gibi ekledik.

görüntü tanımını buraya girin

Genellikle bir bash oturumu sırasında yürütülen komutlar, oturum sonlandırılana kadar .bash_history içine yazılmaz, bu nedenle PROMPT_COMMAND='history -a'komuta girer ve ardından .bash_history'ye girer.

Şimdi ne zaman bir komutta hata veya hata yaparsanız ve silmek istediğinizde o zaman ve orada sadece aşağıdaki yürütmek

sed -i '$d' ~/.bash_history

ve tada silinirdi.

Daha basit hale getirmek için daha basit bir şeye başka isim verebilir ve bunları gibi kullanabilirsiniz

alias rh ='sed -i '\''$d'\'' ~/.bash_history'

Bu nedenle çalıştırma rh, son çalıştırılan komutu tarihe kaldırır.

Yukarıdakiler, yalnızca bir oturum için süren geçici takma adlandırmadır. Kalıcı veya kalıcı bir ekleme yapmak için

alias rh = 'sed -i '\''$d'\'' ~/.bash_history' 

.bashrc

NOT

Her iki tarafında da boşluk olmamalıdır =

Takma Adlara İstemiyorsanız, o zaman aşağıdakileri de yapabilirsiniz:

Bir commad isim yapmak rhve yerleştirmek /bindizinde:

  • Bir dosya açın rhve aşağıdaki kodu yapıştırın, kaydedin ve kapatın:

    sed -i '$d' ~/.bash_history

  • Make rhyürütülebilir ve yerleştirin /bindizinde:

     chmod + x rh
     sudo cp rh / bin 
  • Şimdi rhson komutu tarihten silmek için komutu kullan .


Nerede eklemek PROMPT_COMMAND='history -a'de .bashrcdosyaya? Ve tam olarak ne yapacak? sed -i '$d' ~/.bash_historyDüzenlemeden çalışmayı denedim .bashrc!! Ancak takma olan bir şey çalışmıyor .. Eğer sorumu biraz detaylandırır ve takma adı çalışır hale getirirseniz cevabınızı kabul edeceğim .. :)
Saurav Kumar

@SauravKumar cevabı düzenledi.
Takma

İnan ya da inanma .. diğer ad hala çalışmıyor .. Herhangi bir hatasız çalıştırılıyor ancak .bash_historydosyadan girişi silmiyor ..: P herhangi bir şekilde .. Sorun değil .. Kendi komutumu verdim ve içine yerleştirdim /bindizin. Senin emrinden beri: sed -i "$d" ~/.bash_historyiyi çalışıyor. Cevabınızı kabul ediyorum .. :)
Saurav Kumar

Sakıncası yoksa, cevabınızı başkalarına yararlı olacak şekilde düzenlemek istiyorum ..
Saurav Kumar

Aslında ben düzenlemiştim.
Onaylamalısın

2

Birden fazla satırı kaldırmak için (örneğin 1974 - 1990 arasında, historykomutla kontrol edin ):

  for i in `seq 1974 1990` ; do history -d 1974 ; done

Kaldıracağınız satır numarasının her zaman aynı olduğunu unutmayın; sürekli olarak kaldırıyorsunuz ve diğerine geçiyorsunuz.


Not çok önemlidir.
Weijun Zhou,

1

Bash'de "set -o vi" seçeneğini kullanıyorsanız (Escape tuşuyla geri arama yapmak çok yararlıdır), o zaman çizgiyi arayabilir ve "dd" içeren çizgiyi "vi" de yaptığınız gibi silebilirsiniz.


Komutu tarihe göre açıklığa kavuşturmak için yazmam gerektiğini jveya ksonra yazmam gerektiğini bulurum dd. Başka bir komut Enteryazarsam veya sadece basarsam , bash bunun sadece yeni bir komut olduğunu ve eski komutu tarihte tutması gerektiğini varsayıyor gibi görünmektedir. Ayrıca, doğru yapıldığında komutu temizlediğini, ancak silmediğini - sonucun boş geçmiş girdileri olduğunu not etmek ilginçtir. Ancak bu, komut satırına yazmak zorunda kaldığım ve diğer yanıtlardan çok daha kolay olan şifreleri kaldırmak için yeterince iyi, bu yüzden bunu gönderdiğiniz için çok teşekkürler!
Michael Scheper

0

Bash tarihimde Yubikey'den belki 50 ya da öylesine gereksiz girişler yaptığım bir durum vardı, 'ccccc .....' ile eşleşiyordu. İdeal olarak, geçmişinizin boşlukları görmezden geldiğini farz edersek, sed ile yapabileceğinizi düşündüğüm bir kalıpla eşleşen girişleri silmenin bir yolunu istedim.

Her neyse, tembel oldum ve vim kullandım, 'cccc' aradım ve her maçta bisiklet sürerken 'dd' kullandım. Bir dakikadan fazla sürmedi.


1
Bunu vim'de yapıyorsanız, şunları da yapabilirsiniz: g / cccc / d veya: g / ^ cccc / d: veya bir qqnddq makroyu kullanın @@ (son aramanızın ccccc için olduğunu varsayalım).
htaccess

@htaccess Bu kesinlikle daha kolay olurdu, ama aynı zamanda dosyanın geri kalanını da görsel olarak incelemek istedim.
Dylan_Larkin
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.