Mi respuesta se basa en respuestas anteriores, pero con la adición de invertir la secuencia para que los elementos del historial se eliminen del más reciente al menos reciente.
Obtenga su historial actual (ajuste la cantidad de líneas que desea ver):
history | tail -n 10
Esto me da algo como
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"
Seleccione las posiciones inicial y final para los elementos que desea eliminar. Voy a eliminar las entradas 1006 a 1008.
for h in $(seq 1006 1008); do history -d 1006; done
Esto generará history -d
comandos para 1006, luego 1007 se convierte en 1006 y 1006 se elimina, luego 1008 (se convirtió en 1007) ahora es 1006 y se elimina.
Si también quisiera eliminar el comando de eliminación del historial, entonces es un poco más complicado porque necesita conocer la entrada actual máxima del historial.
Puede obtener esto con (puede haber una mejor manera):
history 1 | awk '{print $1}'
Al unirlo, puede usar esto para eliminar un rango y también eliminar el comando de eliminación del historial:
for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')
Envuelva todo esto en una función para agregar a su ~/.bashrc
:
histdel(){
for h in $(seq $1 $2); do
history -d $1
done
history -d $(history 1 | awk '{print $1}')
}
Ejemplo eliminando los comandos 4, 5 y 6 (1049-1051) y ocultando la evidencia:
[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 pregunta era eliminar los últimos 10 comandos del historial, por lo que si desea ahorrar un poco de esfuerzo, podría usar otra función para llamar a la histdel
función que hace los cálculos por usted.
histdeln(){
# Get the current history number
n=$(history 1 | awk '{print $1}')
# Call histdel with the appropriate range
histdel $(( $n - $1 )) $(( $n - 1 ))
}
Esta función toma 1 argumento, el número de elementos de historial anteriores para eliminar. Entonces, para eliminar los últimos 10 comandos del historial, simplemente use histdeln 10
.
vi $HISTFILE
y borra lo que quieras. Úselohead -n -10
si tiene que automatizarlo.