특정 시간이 지나면 .zsh_history를 자동 제거하는 가장 좋은 방법은 무엇입니까?

특정 시간이 지나면 .zsh_history를 자동 제거하는 가장 좋은 방법은 무엇입니까?

있는 것 같은 느낌이 들어ZSH 설정 옵션 없음.zsh_history특정 시간이 지나면 자동으로 제거됩니다 (예: 지금으로부터 한 달이 넘은 경우). 그것을 달성하는 가장 간단한 해킹은 무엇입니까?

답변1

맞습니다. 에는 시간 기반 만료 옵션이 없습니다 .zsh_history. 아마도 모든 종류의 시간 만료에는 EXTENDED_HISTORY형식(각 명령의 시작 시간 포함)이 필요하고 EXTENDED_HISTORY적어도 대부분의 만료 옵션보다 새로운 기능이기 때문일 것입니다.

또한 zsh 기능은 "시간"이라는 모호한 개념과 가장 좋은 관계를 갖고 있지 않습니다. 이를 이해하려면 시간 기반 글로빙 플래그에 대한 제한 사항을 읽어보세요.

액세스 시간과 현재 부분 사이의 차이 중 적절한 단위의 분수 부분은 비교에서 무시됩니다. 예를 들어, echo *(ah-5)지난 5시간 이내에 액세스한 파일을 에코하고, echo *(ah+5)최소 6시간 전에 액세스한 파일을 에코합니다. 엄격히 말하면 5시간에서 6시간 사이의 시간은 5시간으로 간주됩니다.

그 외에도 중복 제거 옵션이 켜져 있으면 zsh가 제거합니다.나이가 많은최신 항목을 선호하는 항목이므로 "오래된" 항목 목록이 지속적으로 유동하므로 시간 기반 만료가 더 까다로워집니다.

LSerni가 말했듯이 그렇게 하고 싶다면 직접 구문 분석하는 것이 아마도 최선의 선택일 것입니다. 이를 수행하는 데 있어 한 가지 까다로운 점은 기록의 여러 줄 항목이 문자 그대로, 즉 여러 줄로 기록된다는 것입니다. 따라서 일부 줄은 기록 항목이 아니기 때문에 간단히 "한 줄씩" 구문 분석할 수 없습니다. 계속됩니다.

나의 또 다른 걱정은 아마 그럴 일이 없을 것이라는 점이다.진심으로기록 파일을 수정하는 외부 코드는 실행 중인 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])

관련 정보