Minha resposta é baseada em respostas anteriores, mas com a adição de reverter a sequência para que os itens do histórico sejam excluídos da mais recente para a menos recente.
Obtenha seu histórico atual (ajuste o número de linhas que deseja ver):
history | tail -n 10
Isso me dá 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"
Selecione as posições inicial e final dos itens que você deseja excluir. Vou excluir as entradas 1006 a 1008.
for h in $(seq 1006 1008); do history -d 1006; done
Isso gerará history -d
comandos para 1006, depois 1007 se tornará 1006 e 1006 será excluído, depois 1008 (se tornará 1007) agora será 1006 e será excluído.
Se eu também quis excluir o comando delete de histórico, é um pouco mais complicado, porque você precisa conhecer a entrada atual máxima do histórico.
Você pode obter isso com (pode haver uma maneira melhor):
history 1 | awk '{print $1}'
Juntando-o, você pode usá-lo para excluir um intervalo e também excluir o comando de exclusão do histórico:
for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')
Agrupe tudo isso em uma função para adicionar ao seu ~/.bashrc
:
histdel(){
for h in $(seq $1 $2); do
history -d $1
done
history -d $(history 1 | awk '{print $1}')
}
Exemplo excluindo os comandos 4, 5 e 6 (1049-1051) e ocultando a evidência:
[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
A questão era, na verdade, excluir os 10 últimos comandos do histórico; portanto, se você quiser economizar um pouco de esforço, poderá usar outra função para chamar a histdel
função que faz os cálculos para você.
histdeln(){
# Get the current history number
n=$(history 1 | awk '{print $1}')
# Call histdel with the appropriate range
histdel $(( $n - $1 )) $(( $n - 1 ))
}
Esta função requer 1 argumento, o número de itens do histórico anterior a serem excluídos. Então, para excluir os últimos 10 comandos do histórico, basta usar histdeln 10
.
vi $HISTFILE
e exclua o que quiser. Usehead -n -10
se você tiver que automatizá-lo.