마지막으로 수정된 파일을 여는 별칭을 만들어 보세요.

마지막으로 수정된 파일을 여는 별칭을 만들어 보세요.

제가 자주 하는 일은 최근 수정된 파일을 편집하는 것입니다. 그래서 "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다음과 같은 함수를 사용하여 동일한 효과를 얻을 수 있습니다.findsort

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

예를 들어 세 번째 최신 파일을 편집합니다.

관련 정보