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+Yemacs
screen
삽입된 텍스트를 인용해야 하는 경우(예: 공백이나 기타 특수 쉘 문자가 포함되어 있기 때문에) 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, c
SPC 및 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 /
결과를 가져온 다음 원하는 대로 출력을 다듬을 수 있으며, 작성하고 종료하면 마치 쉘 프롬프트에 입력한 것처럼 내용이 명령으로 실행됩니다.