잠시 후 .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의 기록 관리와 직접 통합하는 것 외에도 기록 파일을 수정하는 외부 코드는 항상 zsh.bash불가능한시작 또는 종료 프로세스의 단일 사용자 부분 동안 로그인합니다.

이 Python 코드는 기록을 새 파일에 복사하고 읽은 다음 최종 기한이 지난 항목을 새 파일에 작성하여 문제를 방지합니다.다른새로운 파일. 대상 파일을 변경하여 .zsh_history원본 파일을 덮어쓸 수 있으나, 이로 인해 발생할 수 있는 파일 손상에 대해서는 책임을 지지 않습니다.

그보다 오래된 항목은 CUTOFF삭제됩니다. (예제에서는 7일을 사용했지만 쉽게 1개월로 변경할 수 있습니다 . 7) 이것이 작업 디렉터리로 실행된다고 가정합니다.3031$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])

관련 정보