AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 674414
Accepted
Yvan Sraka
Yvan Sraka
Asked: 2021-10-23 10:44:18 +0800 CST2021-10-23 10:44:18 +0800 CST 2021-10-23 10:44:18 +0800 CST

一段时间后自动删除 .zsh_history 的最佳方法是什么?

  • 772

我觉得没有 ZSH 设置选项可以在一段时间后自动删除.zsh_history(例如,从现在起超过一个月)。实现它的最简单的方法是什么?

zsh command-history
  • 1 1 个回答
  • 189 Views

1 个回答

  • Voted
  1. Best Answer
    FeRD
    2021-10-24T15:19:00+08:002021-10-24T15:19:00+08:00

    正确,没有基于时间的到期选项.zsh_history。可能是因为任何类型的定时到期都需要EXTENDED_HISTORY格式(包括每个命令的开始时间),并且EXTENDED_HISTORY是一个新的(er)功能 - 至少比大多数到期选项更新。

    此外,zsh 功能与“时间”的模糊概念没有最好的关系——只需阅读对基于时间的通配标志的限制即可了解:

    在比较中忽略访问时间和当前部分之间的差值的任何小数部分(以适当的单位)。例如,echo *(ah-5)将回显在过去 5 小时内访问的echo *(ah+5)文件,而将回显至少在 6 小时前访问的文件,因为严格在 5 到 6 小时之间的时间被视为 5 小时。

    除此之外,如果您打开了任何重复删除选项,zsh 将删除旧条目以支持最新条目,因此“旧”条目列表不断变化,使得基于时间的过期变得更加棘手。

    如果您确实想这样做,正如 LSerni 所说,自己解析它可能是最好的选择。这样做的一个棘手的事情是,历史中的多行条目是逐字写出的,意思是多行——所以你不能简单地“逐行”解析它,因为有些行不是历史条目,它们'是延续。

    我的另一个担心是,除了将它与 zsh 的历史管理直接集成之外,可能没有真正安全的方法可以做到这一点,因为任何修改历史文件的外部代码都存在受到(或干扰)正在运行的zsh. 我的意思是,除非您要编写一些bash仅在您无法登录时运行的东西,例如在启动或关闭过程的单用户部分。

    此 Python 代码通过将历史记录复制到新文件、从中读取,然后将传递截止日期的条目写入不同的新文件来避免该问题。目标文件可以更改为.zsh_history覆盖原始文件,但我对可能发生的任何文件损坏不承担任何责任。

    早于 的条目CUTOFF将被删除(我在示例中使用了 7 天,但您可以轻松更改7为30或31一个月。)假设这是$HOME作为工作目录运行的。

    这也假设历史是按时间排序的,我不知道这个假设有多安全。(如果不是真的,您最终可能会保留比预期更多的条目,因为一旦它到达截止时间之后时间戳记的第一个条目,之后的所有内容都会包括在内。因此,在第一个较新条目之后出现的较旧条目将被意外保留。这似乎是一种正确的不正确输出,而不是可能丢弃任何意外的东西。)

    #!/usr/bin/python3
    
    import shutil
    import time
    from itertools import dropwhile
    
    CUTOFF = time.time() - (86400 * 7)  # one week ago
    
    hist = []
    shutil.copy2(".zsh_history", ".zsh_history.bak")
    with open(".zsh_history.bak", "rb") as f:
        for l in f.readlines():
            if l.startswith(b': '):
                # Start of a new history entry
                # Add a new tuple (time, history_line) to the list
                ts = int(l.split(b':')[1])
                hist.append((ts, l))
                continue
            # Continuation line, append it to the previous entry
            prev = hist.pop()
            hist.append((prev[0], b''.join([prev[1], l])))
    
    with open(".zsh_history.new", "wb") as f:
        # Drop list entries while timestamp < CUTOFF,
        # Then write contents of each remaining entry to file
        for l in dropwhile(lambda x: x[0] < CUTOFF, hist):
            f.write(l[1])
    
    • 0

相关问题

  • 列出没有其他后缀文件的文件

  • 什么情况下路径中最先找到的可执行文件不会被使用

  • 符号链接所有点文件和目录

  • 如何在`zsh`中增加一个动态命名的变量

  • 为什么我不能在 zsh 中定义一个名为 path 的只读变量?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve