从Zsh历史记录中删除特定行

87

我想要删除 Zsh 历史记录中的特定条目。

Zsh 的 fchistory 没有删除条目的选项。我已经尝试查找 ~/.zhistory,但文件不存在。我该如何查找历史记录文件的位置并删除条目?


重复的 https://dev59.com/YWw05IYBdhLWcg3wcRUj。Oh-My-Zsh 只是 Zsh 的一个附加组件,它不会改变 Zsh 历史记录的工作方式。 - Marlon Richert
1
omz通过别名将history替换为omz_history - jezmck
13个回答

83
你正在查找错误的文件。请查看~/.zsh_history而不是~/.zhistory。要查看你的历史记录保存在哪个文件中:
echo $HISTFILE

删除:

rm $HISTFILE

14
请注意,在运行rm $HISTFILE之后,您需要注销并重新登录以查看更改。虽然这并没有回答问题,但它不是关于删除整个历史记录(history -c),而是关于删除特定行(history -d [offset])。 - Two-Bit Alchemist
“echo $HISTFILE” 这个命令会被记录到我的 bash 历史记录中。~/.zsh_history 似乎没有我想要删除的条目,还有哪里可能存在呢? - Sten Kin
你正在使用 zsh 吗?如果我在 bash 和 zsh 下执行 echo $HISTFILE,我会得到不同的结果。 - Two-Bit Alchemist
是的,我正在使用oh-my-zsh的zsh,但看起来echo $HISTFILE指向我的bash历史记录文件。 - Sten Kin
这对我完全没有作用 - 即使文件被删除,历史记录仍显示相同的输出。它似乎根本没有与$HISTFILE相关性。 - alexwebb2
1
这是一个严重的错误...在我看来,我应该能够从历史记录中删除特定条目。 - Zabs

55
清除 Zsh 历史记录 (oh-my-zsh)
关闭、退出并重新打开iTerm; 运行nano .zsh_history; 使用箭头键导航到您想要删除的历史记录部分; 使用删除键删除所有不需要的历史日志; 一旦您删除了所有想要删除的内容,选择control X退出; 您将被提示“保存”更改。如果您对更改满意,请单击shift Y; 您将被要求选择要保存更改的位置。使用箭头键导航到您的.zsh_profile并按Enter; 退出并重新启动iTerm; 输入history以确认删除; 您已成功清除Zsh历史记录。
这段文本包含了四个链接:

2
同时,使用vi可以通过/thing查找内容。我不确定nano是否也适用这种方法。 - doug

24

在Unix系统上清除zsh历史记录。

 echo "" > ~/.zsh_history & exec $SHELL -l

7
你可以使用这些命令打开ZSH命令历史记录(当你在主目录或 ~ 目录中时),假设你知道如何使用 vim 或 nano :
命令: - 使用vim: vim ~/.zsh_history - 使用nano: nano ~/.zsh_history
nano ~/.zsh_history
vim ~/.zsh_history
open ~/.zsh_history

然后您可以手动删除要删除的行并保存文件。

如果您的 zsh_history 列表太长,为了方便使用,请按照以下步骤进行操作:

  1. 通过将以下内容添加到 .vimrc 中,在 Vim 环境中启用鼠标移动和行编号:
  2. 打开 .vimrc 文件:
 vim ~/.vimrc
  1. 将以下内容添加到.vimrc中并保存(按ESC键,输入":",输入wq,按Enter键):
:set number
set mouse=a
  1. 使用鼠标并结合 Vim,在 zsh_history 中轻松滚动。
  2. 如果想要在 Vim 中启用复制功能,需按住键盘上的 Shift 键。

6
  1. open ~/.zshrc
  2. add the following line

    alias clear_history='echo "" > ~/.zsh_history & exec $SHELL -l'
    
  3. Save and close the file

  4. Close the console or type zsh
    if you to see the result directly, but this will open another zsh shell in the old one
  5. Now you can clear the console typing clear_history

之前的所有答案都很好,但这是对我有效的解决方案。


非常实用和有帮助的答案。 - code by Abhishek Bharti

6
  1. 在 zsh 命令行中键入并运行命令,打开 ~/.zsh_history (这会在我的 Mac 上打开 TextEdit。)
  2. 删除文件中的任何行
  3. 保存并关闭文件
  4. 完全关闭/退出 Zsh 并重新启动 Zsh (这一步非常重要!)
  5. 现在,打开 zsh,history 命令不会显示您删除的行

6

这个函数可以从你的Zsh历史记录中删除任何一行,不会询问任何问题:

# Accepts one history line number as argument.
# Alternatively, you can do `dc -1` to remove the last line.
dc () {
  # Prevent the specified history line from being saved.
  local HISTORY_IGNORE="${(b)$(fc -ln $1 $1)}"

  # Write out history to file, excluding lines that match `$HISTORY_IGNORE`.
  fc -W

  # Dispose of the current history and read the new history from file.
  fc -p $HISTFILE $HISTSIZE $SAVEHIST

  # TA-DA!
  print -r "Deleted '$HISTORY_IGNORE' from history."
}

如果你希望防止所有dc 命令被写入历史记录,可以在你的~/.zshrc 文件中添加以下内容。
zshaddhistory() {
 [[ $1 != 'dc '* ]]
}

或者,如果需要一种全面的开箱即用的解决方案,请使用我的Zsh Hist插件


这是对原帖问题的正确答案。 - Ahmed Masud

5

2
例如,使用vim可以轻松删除最后n行,操作如下:
  1. 打开文件:vim ~/.zsh_history
  2. 跳到文件底部:G
  3. 标记行:V -> 使用箭头键向上移动
  4. 删除: d
  5. 写入并退出::wq
或者您可以使用光标导航,并使用dd删除任何特定行。

2
  1. fc -W 将历史记录写入历史文件 $HISTFILE

  2. 使用任选编辑器编辑 $HISTFILE,或使用就地 sed 命令将不喜欢的行替换为其他内容或空行。

  3. fc -R$HISTFILE 中读取历史记录。

未来的提示:

  • 在你的.zshrc文件中设置setopt HIST_IGNORE_SPACE。有了这个选项,以空格开头的命令将不会首先出现在历史记录中。只需用一个空格作为敏感命令的前缀。
  • 在你的.zshrc文件中设置setopt INC_APPEND_HISTORY,然后zsh将立即将新命令写入历史文件。这就像在每个新命令之前调用fc -W,但更高效(它不会写入整个历史记录,而是只在文件末尾添加一行)。这样历史文件始终反映当前历史记录,你可以直接编辑,然后调用fc -R。请注意,你随时可以在其他zsh实例(例如另一个终端)中调用fc -IR,并立即使用相同的历史记录(轻松同步历史记录的好方法)。
  • 或者,你可以启用setopt SHARE_HISTORY,它具有与INC_APPEND_HISTORY相同的效果,不过每次命令之后还会调用fc -R,因此基本上没有内存中的历史记录,历史记录始终写入和从文件读取,并且在所有实例中共享,因此所有zsh实例始终共享完全相同的历史记录,并且编辑历史记录文件还会立即编辑所有zsh实例的历史记录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接