제가 자주 하는 일은 최근 수정된 파일을 편집하는 것입니다. 그래서 "ls -lr"을 입력한 다음 "vim lastfile"을 입력하는 대신 ~/.bash_profile 파일에 몇 가지 바로가기를 만들고 싶었습니다.
alias via="vim `ls -rt | tail -1`"
alias vib="vim `ls -rt | tail -2 | head -1`"
alias vic="vim `ls -rt | tail -3 | head -1`"
alias vid="vim `ls -rt | tail -4 | head -1`"
alias vie="vim `ls -rt | tail -5 | head -1`"
이상하게도 문제는 이러한 명령이 작동하지 않는다는 것입니다. 그들은 마지막 파일이 아닌 일부 파일을 열었고 심지어 현재 디렉터리에서 파일을 삭제했습니다(해당 디렉터리에 어떤 종류의 파일 캐시 업데이트 문제가 있는지 궁금합니다. 이 문제는 내 로컬 컴퓨터와 내 클러스터에서 발생합니다). .
하지만 vim `ls -rt | tail -1`
별칭을 사용하지 않고 직접 입력하면 매번 작동합니다.
답변1
문제는 별칭 정의에서 백틱을 인용해야 한다는 것입니다. 큰따옴표( "
)는 명령 대체를 인용하지 않습니다. 작은따옴표( )가 필요합니다 '
. 사용
alias via='vim `ls -rt | tail -1`'
실제로는 다음을 원하지만:
alias via='vim -- "$(ls -t | head -n 1)"'
그건:
$(...)
이를 수행할 때 현대적인 형태의 명령 대체( )를 사용하십시오.- 이를 인용하여 분할+glob 연산자를 비활성화합니다. 그렇지 않으면 파일 이름에 IFS 문자나 와일드카드가 있으면 제대로 작동하지 않습니다(개행 문자가 있으면 여전히 제대로 작동하지 않습니다).
--
옵션의 끝을 표시하는 데 사용됩니다 (그렇지 않으면vim
또는로 시작하는 파일 이름에는 영향을 주지 않습니다).-
+
ls -t | head
결과를 더 빨리 얻으 려면 대신 사용하세요ls -rt | tail
.
사용하지 마세요
alias via="vim `ls -rt | tail -1`"
이렇게 하면 별칭을 실행할 때가 아니라 별칭을 정의할 때 명령 대체가 발생합니다. alias via
실제로 출력이 alias via='vim `ls -rt | tail -1`'
아닌지 확인하려면 입력해 보십시오 alias via='vim <prematurely expanded output>'
.
답변2
zsh
(OS/X에도 사전 설치되어 있음)을 사용 하고 완성 시스템( compinit
및 공동) 을 사용한다고 가정하면 Ctrl+Xm최신 파일로 확장되는 완성자가 됩니다.
그래서:
육Ctrl+Xm
최신 파일을 편집할 수 있습니다(를 누르기 전에 해당 파일을 볼 수도 있습니다 Return).
육Alt+2Ctrl+Xm
두 번째 최신 파일의 경우.
6*.cCtrl+Xm
최신 c
파일을 받으세요.
육*(.)Ctrl+Xm
최신을 위해정기적인파일(디렉토리가 아님, fifo/devices가 아님...) 등
또한 별칭을 다음과 같이 정의합니다.
alias via='vim -- *(.om[1])'
구문 분석 없이 현재 디렉토리에서 최신(숨겨지지 않은) 일반 파일을 편집합니다 ls
.
및 의 GNU 구현을 가정하면 bash
다음과 같은 함수를 사용하여 동일한 효과를 얻을 수 있습니다.find
sort
via() {
local file
IFS=/ read -rd '' file file < <(
find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
sort -rzn
) && vim -- "$file"
}
두 번째, 세 번째... 최신 파일을 지정할 수 있도록 매개변수화할 수 있습니다(GNU Bash 4.4 이상 및 GNU coreutils 8.25 이상 가정).
via() {
local files
readarray -d '' -t files < <(
find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
sort -rzn | cut -zd / -f 2
) && ((${#files[@]} >= ${1-1} )) && vim -- "${files[${1-1}-1]}"
}
다음과 같이 사용됩니다:
via 3
예를 들어 세 번째 최신 파일을 편집합니다.