Удалить последние N строк из истории Bash


40

Случайно вставляя файл в оболочку, он добавляет кучу безобразных бессмысленных записей в историю bash. Есть ли чистый способ удалить эти записи? Очевидно, что я мог бы закрыть оболочку и отредактировать .bash_historyфайл вручную, но, может быть, есть какой-то API, доступный для изменения истории текущей оболочки?

Ответы:


36

Вы можете использовать history -d offsetвстроенную функцию, чтобы удалить конкретную строку из истории текущей оболочки или history -cочистить всю историю.

Это не очень удобно, если вы хотите удалить диапазон строк, поскольку в качестве аргумента требуется только одно смещение, но вы можете заключить его в функцию с помощью цикла.

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

Назовите его rmhist first_line_to_delete last_line_to_delete. (Номера строк в соответствии с выводом history.)

(Используйте history -wдля принудительной записи в файл истории.)


1
Так как ОП попросил удалить N последних строк, этот скрипт следует изменить, выполнив что-то вроде:, tot_lines=$(history | wc -l)а затем повторить history -d $(( tot_lines - $1 )).
PlasmaBinturong

2
Вместо этого $(history | wc -l)есть переменная, $HISTCMDкоторую можно использовать.
PlasmaBinturong

29

Только этот вкладыш в командной строке поможет.

for i in {1..N}; do history -d START_NUM; done

Где START_NUM - начальная позиция в истории. N - количество записей, которые вы можете удалить.

например: for i in {1..50}; do history -d 1030; done


3
Интересно, почему это уже не встроенная функция? «История» - очень старый инструмент.
Петр Гладких

служит цели очень хорошо, но эту команду можно увидеть в истории :)
Раджив Акоткар

askubuntu.com/a/978276/22866 имеет хороший способ удалить «команду удаления из истории» из истории :-)
HanSooloo

0

Ответ от пользователя 2982704 почти работал для меня, но не совсем. Я должен был сделать небольшое изменение, как это.

Предполагая, что моя история на 1000, и я хочу удалить последние 50 записей

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.