찾기 또는 이동에서 결과를 여는 빠른 방법

찾기 또는 이동에서 결과를 여는 빠른 방법

find또는 를 실행하면 locate일치하는 파일이 한 줄에 하나씩 stdout에 채워집니다. 다음 단계는 일반적으로 이러한 파일 중 하나를 여는 것입니다. 전체 파일 경로를 입력할 필요 없이 어떤 방식으로든 검색 결과와 상호 작용할 수 있다면 더 빠르고 효율적일 것입니다. 검색 결과에 표시된 파일을 여는 가장 빠른 방법은 무엇입니까?

에 제공된 솔루션과 유사합니다."vi"를 사용하여 "찾기" 결과를 엽니다.,여러 파일을 "찾고" vim에서 여는 방법은 무엇입니까?, 그리고 "찾기" 명령의 결과에 따라 조치를 취하는 방법은 무엇입니까?입력해야 하는 두 번째 명령이 꽤 길어서 원하는 만큼 빠르지 않습니다.

대신 검색 결과의 각 파일을 숫자 변수 이름(s1 - sn)에 자동으로 할당하여 첫 번째 결과를 열려면 을 입력하는 방법이 있습니까 vi $s1? 아니면 이와 같은 퍼지 파인더를 사용하여 이 문제를 해결하는 것이 더 나은 방법입니까?후지브또는파시스트 당원?

답변1

나는 이것을 ~/.screenrc한동안 가지고 있었습니다:

bind -c pasteline 1 eval copy 'stuff "-Y"' 'paste .'
bind -c pasteline 2 eval copy 'stuff "2-Y"' 'paste .'
bind -c pasteline 3 eval copy 'stuff "3-Y"' 'paste .'
bind -c pasteline 4 eval copy 'stuff "4-Y"' 'paste .'
bind -c pasteline 5 eval copy 'stuff "5-Y"' 'paste .'
bind -c pasteline 6 eval copy 'stuff "6-Y"' 'paste .'
bind -c pasteline 7 eval copy 'stuff "7-Y"' 'paste .'
bind -c pasteline 8 eval copy 'stuff "8-Y"' 'paste .'
bind -c pasteline 9 eval copy 'stuff "9-Y"' 'paste .'
bindkey ¬ command -c pasteline

기본적으로 ¬1화면 내에서 입력하는 경우 첫 번째 줄이 커서 위에 삽입된 ¬2다음 두 번째 줄 등이 삽입됩니다.

내 것에 ~/.Xdefaults도 다음이 있습니다.

XTerm.VT100.translations:             #override\
    Meta <KeyPress> /: dabbrev-expand()

화면 내용을 xterm기준으로 완료 할 수 있습니다 (커서 위치에서 뒤를 돌아보며).Alt+/

의 경우 zsh내에서 사용하면 screen다음을 수행할 수 있습니다.

copy-screen() {
  screen -X eval copy 'stuff "-$ H\r"' 'writebuf .lastoutput'
  killring=(${(Oaf)"$(<~/.lastoutput)"})
  CUTBUFFER=$killring[1]
  killring[1]=()
}
zle -N copy-screen
bindkey '\ec' copy-screen

Alt+C커서 위의 줄을 잘라내기 버퍼에 저장하고 루프(모달에서 붙여넣고 반복하는 것)를 종료 Ctrl+Y하는 위젯 에 바인딩합니다 . (위에서는 홈 디렉터리에서 시작한다고 가정합니다.)Alt+Yemacsscreen

삽입된 텍스트를 인용해야 하는 경우(예: 공백이나 기타 특수 쉘 문자가 포함되어 있기 때문에) Alt+"for를 입력하여 zsh인용할 수 있습니다.

예를 들어 방금 다음을 실행했습니다.

$ find /usr/local -size +1M
/usr/local/lib/liblzma.a
/usr/local/share/doc/sudo/ChangeLog
/usr/local/share/perl/5.18.2/Unicode/Unihan/Definition.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/RSKangXi.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRG_TSource.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/HanYu.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/RSUnicode.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRG_GSource.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRGKangXi.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRGHanyuDaZidian.db    

위의 sudo ChangeLog를 열고 싶습니다 vim. 첫 번째 방법을 사용하면 다음을 입력해야 합니다.

vim ¬9

두 번째 방법을 사용하십시오.

vim /우리Alt+/

그리고 Alt+/변경 로그가 나타날 때까지 이를 반복하세요.

세 번째 방법을 사용하십시오.

Alt+CCtrl+YAlt+Y

그리고 Alt+Y변경 로그가 나타날 때까지 이를 반복하세요.

마지막 방법을 $s1쿼리에 사용할 수 있습니다.

배열에 저장하지 말고 killring배열(예: )에 저장하여 첫 번째 행, 두 번째 행 $s에 사용하세요 ...$s[1]$s[2]

copy-screen() {
  screen -X eval copy 'stuff "-$ H\r"' 'writebuf .lastoutput'
  s=(${(Oaf)"$(<~/.lastoutput)"})
}
zle -N copy-screen
bindkey '\ec' copy-screen

Alt+C커서 위의 줄을 s배열 에 저장 합니다 .

그럼에도 불구하고 우리는 화면에 표시된 내용을 검색하고 있는데, 이는 마지막 명령 출력 내용과 반드시 ​​동일하지는 않습니다. 예를 들어 printf 'a\bc \n'5바이트 a, BS, cSPC 및 LF를 출력하지만 표시만 됩니다 c.

답변2

Bash 배열의 추악함을 견딜 수 있다면 이렇게 할 수 있습니다.

mapfile res < <(find -name <pattern>)

또는

mapfile res < <(locate <pattern>)

그러면 행이 배열로 저장됩니다 res.

그런 다음 일치 항목을 확인하고 반복할 수 있습니다.

$ echo "${res[@]}" # lists all matches
$ editor ${res[2]} # opens the third match

폴리스티렌

그러나 저는 마우스를 사용하여 필요한 행을 선택했습니다. 아니면 그냥 하세요

$ editor `locate <pattern>`

내가 안다면 너무 많은 결과나 "멋진" 캐릭터가 없을 것입니다.

답변3

그리고 bash:

IFS=$'\n' select fname in $(locate fubar); do
    if [ "$fname" ]; then
        vim "$fname"
        break
    fi
done

빔 사용:

!!locate fubar

- 그런 다음 원하는 파일로 이동하여 을 누릅니다 gf. :h gf및 을 참조하십시오 :h 'isfname'.

Vim을 사용하는 또 다른 방법: :h :find최신 버전의 Vim 사용을 참조하세요 :h :filter.

Vim을 사용하는 또 다른 방법:단일성끼워 넣다. 또는 grep유사한 작업의 경우 다음을 사용합니다.CtrlSF끼워 넣다. 물론 다른 방법도 많이 있습니다.

답변4

나는 방법을 생각했다. 쉘 환경에서는 "EDITOR"로 지정된 전체 화면 편집기를 사용할 수 있습니다. ^X^E편집기를 실행하려면 (ctrl-x, ctrl-e)를 누르세요 . 편집기(예: vim)에서 다음을 실행할 수 있습니다.

:r!find /

결과를 가져온 다음 원하는 대로 출력을 다듬을 수 있으며, 작성하고 종료하면 마치 쉘 프롬프트에 입력한 것처럼 내용이 명령으로 실행됩니다.

관련 정보