Zsh

一段時間後自動刪除 .zsh_history 的最佳方法是什麼?

  • October 23, 2021

我覺得沒有 ZSH 設置選項可以在一段時間後自動刪除.zsh_history(例如,從現在起超過一個月)。實現它的最簡單的方法是什麼?

正確,沒有基於時間的到期選項.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 天,但您可以輕鬆更改73031一個月。)假設這是$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])

引用自:https://unix.stackexchange.com/questions/674414