Ma réponse est basée sur les réponses précédentes, mais avec l'ajout de l'inversion de la séquence afin que les éléments de l'historique soient supprimés du plus récent au moins récent.
Obtenez votre historique actuel (ajustez le nombre de lignes que vous souhaitez voir):
history | tail -n 10
Cela me donne quelque chose comme
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"
Sélectionnez les positions de début et de fin des éléments à supprimer. Je vais supprimer les entrées 1006 à 1008.
for h in $(seq 1006 1008); do history -d 1006; done
Cela générera des history -d
commandes pour 1006, puis 1007 devient 1006 et 1006 est supprimé, puis 1008 (devenu 1007) est maintenant 1006 et est supprimé.
Si je voulais également supprimer la commande de suppression d'historique, c'est un peu plus compliqué car vous devez connaître l'entrée d'historique max actuelle.
Vous pouvez l'obtenir avec (il y a peut-être un meilleur moyen):
history 1 | awk '{print $1}'
En le rassemblant, vous pouvez l'utiliser pour supprimer une plage et également supprimer la commande de suppression de l'historique:
for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')
Enveloppez tout cela dans une fonction à ajouter à votre ~/.bashrc
:
histdel(){
for h in $(seq $1 $2); do
history -d $1
done
history -d $(history 1 | awk '{print $1}')
}
Exemple de suppression des commandes 4, 5 et 6 (1049-1051) et de masquage des preuves:
[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 question était en fait de supprimer les 10 dernières commandes de l'historique, donc si vous voulez économiser un peu d'effort, vous pouvez utiliser une autre fonction pour appeler la histdel
fonction qui fait les calculs pour vous.
histdeln(){
# Get the current history number
n=$(history 1 | awk '{print $1}')
# Call histdel with the appropriate range
histdel $(( $n - $1 )) $(( $n - 1 ))
}
Cette fonction prend 1 argument, le nombre d'éléments d'historique précédents à supprimer. Donc, pour supprimer les 10 dernières commandes de l'historique, utilisez simplement histdeln 10
.
vi $HISTFILE
et supprimez ce que vous voulez. À utiliserhead -n -10
si vous devez l'automatiser.