あるような気がするZSH設定オプションなし一定時間.zsh_history
(たとえば、今から1か月以上)が経過すると、自動的に削除されます。この機能を実装する最も簡単な方法は何ですか?
ベストアンサー1
そうですね。時間ベースの有効期限オプションはありません.zsh_history
。おそらく、すべての種類の時間の有効期限にはEXTENDED_HISTORY
書式設定(各コマンドの開始時間を含む)が必要で、EXTENDED_HISTORY
少なくともほとんどの有効期限オプションよりも新機能です。
また、zsh 機能は「時間」というあいまいな概念と最良の関係はありません。理解するには、時間ベースのワイルドカードフラグの制限事項をお読みください。
アクセス時間と現在の部分との間の適切な単位差の分数部分は、比較では無視される。たとえば、
echo *(ah-5)
過去5時間以内にアクセスしたファイルはエコーされ、echo *(ah+5)
少なくとも6時間前にアクセスしたファイルはエコーされます。厳密に5〜6時間の時間は5時間と見なされるからです。
これに加えて、重複排除オプションがオンの場合、zshは削除します。年をとるアイテムが最新のアイテムに偏っているため、「以前」のアイテムのリストが変更され続け、時間ベースの有効期限がより厳しくなります。
LSerniが言ったように、本当にこれを行うには、直接解析するのが最善の選択です。これを行う際の難しい点の1つは、レコード内の複数行のエントリが文字通り、つまり複数行に書き込まれることです。したがって、一部の行は履歴項目ではないため、単に「1行ずつ」解析することはできません。続きます。
私が持っているもう一つの心配はそうではないかもしれないということです。本当にzshの履歴管理と直接統合することに加えて、履歴ファイルを変更する外部コードは常にzsh
。bash
不可能開始プロセスまたは終了プロセスの単一ユーザー部分の間にログインします。
このPythonコードは、履歴を新しいファイルにコピーして読み込み、期限が過ぎたエントリを新しいファイルに書き込むことで問題を回避します。その他新しいファイル。宛先ファイルを変更して.zsh_history
元のファイルを上書きすることはできますが、それによって発生する可能性があるファイルの破損については責任を負いません。
それより古い項目はCUTOFF
削除されます。 (例では7日を使用しましたが、簡単に1ヶ月に変更できます。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])