Moja odpowiedź jest oparta na poprzednich odpowiedziach, ale z dodatkiem odwrócenia kolejności, tak aby pozycje historii były usuwane od najnowszych do najświeższych.
Pobierz swoją aktualną historię (dostosuj liczbę wierszy, które chcesz zobaczyć):
history | tail -n 10
To daje mi coś takiego
1003 25-04-2016 17:54:52 echo "Command 1"
1004 25-04-2016 17:54:54 echo "Command 2"
1005 25-04-2016 17:54:57 echo "Command 3"
1006 25-04-2016 17:54:59 echo "Command 4"
1007 25-04-2016 17:55:01 echo "Command 5"
1008 25-04-2016 17:55:03 echo "Command 6"
1009 25-04-2016 17:55:07 echo "Command 7"
1010 25-04-2016 17:55:09 echo "Command 8"
1011 25-04-2016 17:55:11 echo "Command 9"
1012 25-04-2016 17:55:14 echo "Command 10"
Wybierz pozycję początkową i końcową dla elementów, które chcesz usunąć. Skasuję wpisy od 1006 do 1008.
for h in $(seq 1006 1008); do history -d 1006; done
Spowoduje to wygenerowanie history -d
poleceń dla 1006, następnie 1007 stanie się 1006 i 1006 zostanie usunięte, a następnie 1008 (stało się 1007) to teraz 1006 i zostanie usunięte.
Jeśli chciałem również usunąć polecenie usuwania historii, jest to nieco bardziej skomplikowane, ponieważ musisz znać aktualny wpis historii max.
Możesz to uzyskać za pomocą (może być lepszy sposób):
history 1 | awk '{print $1}'
Łącząc to razem, możesz użyć tego do usunięcia zakresu, a także usunięcia polecenia usuwania historii:
for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')
Podsumuj to wszystko w funkcji, aby dodać do ~/.bashrc
:
histdel(){
for h in $(seq $1 $2); do
history -d $1
done
history -d $(history 1 | awk '{print $1}')
}
Przykład usunięcia polecenia 4, 5 i 6 (1049-1051) i ukrycia dowodów:
[18:21:02 jonathag@gb-slo-svb-0221 ~]$ history 11
1046 25-04-2016 18:20:47 echo "Command 1"
1047 25-04-2016 18:20:48 echo "Command 2"
1048 25-04-2016 18:20:50 echo "Command 3"
1049 25-04-2016 18:20:51 echo "Command 4"
1050 25-04-2016 18:20:53 echo "Command 5"
1051 25-04-2016 18:20:54 echo "Command 6"
1052 25-04-2016 18:20:56 echo "Command 7"
1053 25-04-2016 18:20:57 echo "Command 8"
1054 25-04-2016 18:21:00 echo "Command 9"
1055 25-04-2016 18:21:02 echo "Command 10"
1056 25-04-2016 18:21:07 history 11
[18:21:07 jonathag@gb-slo-svb-0221 ~]$ histdel 1049 1051
[18:21:23 jonathag@gb-slo-svb-0221 ~]$ history 8
1046 25-04-2016 18:20:47 echo "Command 1"
1047 25-04-2016 18:20:48 echo "Command 2"
1048 25-04-2016 18:20:50 echo "Command 3"
1049 25-04-2016 18:20:56 echo "Command 7"
1050 25-04-2016 18:20:57 echo "Command 8"
1051 25-04-2016 18:21:00 echo "Command 9"
1052 25-04-2016 18:21:02 echo "Command 10"
1053 25-04-2016 18:21:07 history 11
Właściwie chodziło o usunięcie ostatnich 10 poleceń z historii, więc jeśli chcesz zaoszczędzić trochę wysiłku, możesz użyć innej funkcji, aby wywołać histdel
funkcję, która wykonuje obliczenia za Ciebie.
histdeln(){
n=$(history 1 | awk '{print $1}')
histdel $(( $n - $1 )) $(( $n - 1 ))
}
Ta funkcja przyjmuje 1 argument, liczbę poprzednich elementów historii do usunięcia. Aby usunąć ostatnie 10 poleceń z historii, po prostu użyj histdeln 10
.
vi $HISTFILE
i usuń to, co chcesz. Użyj,head -n -10
jeśli musisz to zautomatyzować.