我感覺好像有沒有 ZSH 設定選項在一定時間後自動刪除.zsh_history
(例如從現在起超過一個月)。實現它的最簡單的技巧是什麼?
答案1
正確,沒有基於時間的到期選項.zsh_history
。可能是因為任何類型的定時到期都需要EXTENDED_HISTORY
格式(其中包括每個命令的開始時間),並且EXTENDED_HISTORY
是一個新功能 - 至少比大多數到期選項新。
此外,zsh 功能與「時間」的模糊概念沒有最好的關係——只需閱讀基於時間的通配標誌的限制即可理解:
在比較中,將忽略訪問時間與當前部分之間以適當單位表示的差異的任何小數部分。例如,
echo *(ah-5)
將回顯最近五個小時內訪問的文件,而echo *(ah+5)
會回顯至少六個小時前訪問的文件,因為嚴格介於五到六個小時之間的時間將被視為五個小時。
除此之外,如果您開啟了任何重複刪除選項,zsh 將會刪除較老的條目傾向於最新條目,因此「舊」條目清單不斷變化,使得基於時間的過期變得更加棘手。
如果你確實想這樣做,正如 LSerni 所說,自己解析它可能是最好的選擇。這樣做的一個棘手的事情是,歷史記錄中的多行條目是逐字寫出的,這意味著在多行上- 所以你不能簡單地“逐行”解析它,因為有些行不是歷史條目,它們是延續。
我的另一個擔憂是可能沒有確實除了直接將其與 zsh 的歷史管理整合之外,這是一種安全的方法,因為任何修改歷史文件的外部程式碼都面臨著來自zsh
.我的意思是,除非你要寫一些東西,bash
只有當你不可能登錄,例如在啟動或關閉過程的單一用戶部分期間。
此 Python 程式碼透過將歷史記錄複製到新文件,從中讀取,然後將傳遞截止日期的條目寫入到一個新文件中來避免該問題。不同的新文件。可以更改目標文件以.zsh_history
覆蓋原始文件,但我對可能發生的任何文件損壞不承擔任何責任。
早於的條目CUTOFF
將被刪除(我在範例中使用了 7 天,但您可以輕鬆更改7
為30
或31
1 個月。)假設這是$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])