vim에서 최근 수정된 파일 열기

vim에서 최근 수정된 파일 열기

다음 명령은 유효합니다

$ ls -1t | head -1
git_sync_log20180924_00.txt

$ vi git_sync_log20180924_00.txt

그러나 이것은 그렇지 않습니다

$ ls -1t | head -1 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.

어떻게 해야 합니까(최근 수정된 파일을 vi에서 열기)?

답변1

vi -- "$(ls -t | head -n 1)"

(파일 이름에 개행 문자가 포함되어 있지 않다고 가정).

또는 다음을 사용하는 경우 zsh:

vi ./*(om[1])

또는:

vi ./*(.om[1])

단지 고려정기적인문서.

vi ./*(.Dom[1])

또한 고려숨겨진파일을 사용합니다( 를 사용하는 것과 동일 ls -At).

이는 파일 이름에 포함된 문자 또는 바이트 값에 관계없이 작동합니다. 후자에 해당하는 GNU 쉘 및 유틸리티의 경우 다음을 수행할 수 있습니다.

IFS= read -rd '' file < <(
  find . ! -name . -prune -type f -printf '%T@\t%p\0' | sort -zrn | cut -zf2-) &&
  vi "$file"

답변2

파이프라인 구조의 경우 xargs다음과 같이 사용할 수 있습니다.

ls -1t | head -1 | xargs vi

답변3

불안정한 출력에 의존하지 않는 보다 안정적인 솔루션이 필요한 경우 대부분의 구현에는 제공할 타임스탬프 나 Awk 스크립트를 포함할 수 있는 ls사용자 정의 출력 형식을 지정하는 방법이 있습니다. 몇 가지 예:stat(1)sort(1)

  • GNU coreutils 사용:

    stat -L -c '%Y %n' -- *
    
  • BSD coreutils 사용:

    stat -L -t '%s' -f '%Sm %N' ./*
    

그런 다음 결과를 정렬하고 필터링할 수 있습니다.

  • coreutils만 사용:

    stat ... | sort -t ' ' -k 1,1 -n -r | head -n 1 | cut -d ' ' -f 2-
    

    최대값만 원하더라도 전체 입력을 정렬하는 데 O(n log n) 시간이 걸립니다.

  • awk를 사용하세요:

    stat ... | awk -F ' ' 'NR == 1 || $1 > m { m = $1; n = substr($0, length(m) + 2); } END{ if (NR) print(n); }'
    

    이는 최대값만 비교하고 업데이트하기 때문에 O(n) 시간에 실행됩니다.

관련 정보