Моя відповідь ґрунтується на попередніх відповідях, але з додаванням зворотної послідовності, щоб елементи історії видалялися від останніх до найменших останніх.
Отримайте поточну історію (регулюйте кількість рядків, які ви хочете переглянути):
history | tail -n 10
Це дає мені щось подібне
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"
Виберіть початкову та кінцеву позиції для елементів, які потрібно видалити. Я збираюся видалити записи від 1006 до 1008.
for h in $(seq 1006 1008); do history -d 1006; done
Це створить history -d
команди для 1006, потім 1007 стає 1006 і 1006 буде видалено, потім 1008 (став 1007) тепер 1006 і видаляється.
Якщо я також хотів видалити команду delete delete, то це трохи складніше, тому що вам потрібно знати поточний максимум історії історії.
Ви можете отримати це за допомогою (може бути кращий спосіб):
history 1 | awk '{print $1}'
Складаючи його разом, ви можете використовувати це для видалення діапазону, а також видалити команду видалення історії:
for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')
Згорніть все це у функції, яку потрібно додати до свого ~/.bashrc
:
histdel(){
for h in $(seq $1 $2); do
history -d $1
done
history -d $(history 1 | awk '{print $1}')
}
Приклад видалення команд 4, 5 і 6 (1049-1051) і приховування доказів:
[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
Питання полягало в тому, щоб видалити останні 10 команд з історії, тому, якщо ви хочете зекономити трохи зусиль, ви можете скористатися іншою функцією для виклику histdel
функції, яка робить для вас обчислення.
histdeln(){
# Get the current history number
n=$(history 1 | awk '{print $1}')
# Call histdel with the appropriate range
histdel $(( $n - $1 )) $(( $n - 1 ))
}
Ця функція займає 1 аргумент, кількість попередніх елементів історії, які потрібно видалити. Тому для видалення останніх 10 команд з історії просто використовуйте histdeln 10
.
vi $HISTFILE
і видаліть те, що ви хочете. Використовуйте,head -n -10
якщо вам доведеться його автоматизувати.