La mia risposta si basa su risposte precedenti, ma con l'aggiunta di invertire la sequenza in modo che gli elementi della cronologia vengano eliminati dal più recente al meno recente.
Ottieni la tua cronologia attuale (regola il numero di righe che vuoi vedere):
history | tail -n 10
Questo mi dà qualcosa di simile
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"
Seleziona le posizioni iniziale e finale per gli elementi che desideri eliminare. Ho intenzione di eliminare le voci da 1006 a 1008.
for h in $(seq 1006 1008); do history -d 1006; done
Questo genererà i history -d
comandi per 1006, quindi 1007 diventa 1006 e 1006 viene eliminato, quindi 1008 (diventato 1007) ora è 1006 e viene eliminato.
Se volessi anche eliminare il comando di eliminazione della cronologia, è un po 'più complicato perché è necessario conoscere la voce della cronologia massima corrente.
Puoi ottenerlo con (potrebbe esserci un modo migliore):
history 1 | awk '{print $1}'
Mettendolo insieme puoi usarlo per eliminare un intervallo e anche cancellare il comando di cancellazione della cronologia:
for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')
Riempi tutto in una funzione da aggiungere al tuo ~/.bashrc
:
histdel(){
for h in $(seq $1 $2); do
history -d $1
done
history -d $(history 1 | awk '{print $1}')
}
Esempio di cancellazione dei comandi 4, 5 e 6 (1049-1051) e nascondendo l'evidenza:
[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
La domanda era in realtà quella di eliminare gli ultimi 10 comandi dalla cronologia, quindi se vuoi risparmiare un piccolo sforzo potresti usare un'altra funzione per chiamare la histdel
funzione che fa i calcoli per te.
histdeln(){
# Get the current history number
n=$(history 1 | awk '{print $1}')
# Call histdel with the appropriate range
histdel $(( $n - $1 )) $(( $n - 1 ))
}
Questa funzione accetta 1 argomento, il numero di elementi della cronologia precedente da eliminare. Quindi per eliminare gli ultimi 10 comandi dalla cronologia basta usare histdeln 10
.
vi $HISTFILE
ed elimina ciò che desideri. Utilizzarehead -n -10
se è necessario automatizzarlo.