![vim에서 최근 수정된 파일 열기](https://linux55.com/image/11400/vim%EC%97%90%EC%84%9C%20%EC%B5%9C%EA%B7%BC%20%EC%88%98%EC%A0%95%EB%90%9C%20%ED%8C%8C%EC%9D%BC%20%EC%97%B4%EA%B8%B0.png)
다음 명령은 유효합니다
$ 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) 시간에 실행됩니다.