一段時間後自動刪除 .zsh_history 的最佳方法是什麼?
我覺得沒有 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 天,但您可以輕鬆更改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])