여러 파일을 찾아서 vim에서 여는 방법은 무엇입니까?


10

나는 파일 이름이 있다고 가정 filename123.txt하고 그렇게라는 하나의 파일이고, 내가 할 수있는 locate명령으로 그것을 locate filename123. 그리고이 파일 만 반환합니다.

이제 vi/ 로 열어보고 싶습니다 vim. 그러나 해당 위치로 이동하고 vi명령 뒤에 파일 이름을 입력하고 싶지 않습니다 . 여기 locate filename123에 vi 명령에 결과를 추가 하고 싶습니다 . 어떻게해야합니까? 나는 이미 시도했다 :

locate filename123 | vi

그러나 이것은 작동하지 않습니다. 이 오류는 터미널에서 발생합니다.

santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.

답변:


12

당신은 사용할 수 있습니다 xargs:

locate filename123 | xargs vi

기본적으로 xargs시스템의 ARG_MAX 에 따라 가능한 많은 매개 변수를 전달하여 지정된 명령의 인스턴스를 가능한 적게 실행합니다 . 의 인스턴스에 전달되는 매개 변수 수를 제한하려면 ' 옵션을 vi사용하십시오 .xargs-n

공백이 포함 된 파일 이름을 처리하려면 xargs' -d옵션을 사용하십시오 .

locate filename123 | xargs -d '\n' vi

줄 바꿈이 포함 된 파일 이름을 처리하려면 xargs' -0옵션과 함께 locate' -0옵션을 사용하십시오.

locate -0 filename123 | xargs -0 vi

( -0어느 것도 사용할 수없는 경우 , --null문자 \000를 구분자 로 지정하는 다른 방법도 확인하십시오 .)


이 파일을 열기 전에 무엇을 방해했는지 무엇을 말해 줄 수 있습니까?
Santosh Kumar

1
@Santosh locate명령 의 출력 을 vi의 입력 으로 전달했습니다 . Vi는 다른 프로그램과 마찬가지로 파일 이름이 인수로 작동 할 것으로 예상합니다.
Gilles 'SO- 악마 그만해'

@manatwork 문제는 파일 이름을 공백으로 찾아서 열 수 없다는 것입니다. 예를 들어이 명령은 vim에서 여러 파일을 엽니 다. I \ have \ to \ download | xargs vi
Santosh Kumar

3

명령 확장을 사용할 수 있습니다.

vi "$(locate filename123 | head -n1)"

vimstdin을 읽으 려면 할 수 vim -있지만 출력 locate은 파일 이름 경로입니다. vim gf정상적인 명령을 사용 하면 커서가있는 경로가 열립니다.

편집하다

파일 이름에 공백이 있으면 xargs위에서 언급 한 옵션이나 vim솔루션 을 사용하는 것이 좋습니다 . 메이크업의에 참고 gf작품은 당신에게 공간을 추가해야합니다 isfname:

set isfname+=32

이 팁과 대안은 여기 에 설명되어 있습니다 .

편집 2

의견head 에 PeterO가 제안한대로 따옴표를 추가했습니다 .


공백이있는 파일의 경우 vi $ (다른 위치 \ 파일 찾기)와 같이 파일 이름에 \를 삽입하면됩니다. Vim은 두 개의 별도의 파일로 열립니다, another그리고 file:(.
산토 쉬 쿠마에게

귀하의 답변은 찾은 파일에 공백이 없을 때만 작동합니다.
Santosh Kumar

답변이 업데이트되었습니다.
Thor

2
@Thor : 질문에서 언급 한 것처럼 단일 파일의 경우 프로세스 대체를 따옴표로 묶어야합니다. vi "$(locate filename123)"... 처리 할 파일 이름 이 하나만 있는지 확인하려면 :vi "$(locate filename123 |head -n1)"
Peter.O

PeterO : 네 말이 맞아, 나는 여러 번의 적중으로 만 테스트했다. 귀하의 의견을 답변에 추가했습니다.
Thor

1

가장 간단한 방법은 다음 locate과 같이 쉘 대체로 전달 하는 것입니다.

vim $(locate filename123)

다음과 같이 편집 할 파일 이름을 전달 하는 find대신 사용을 고려할 수도 있습니다 locate.

find . -name 'filename123' -exec vim {} +

Unix / OSX에서는 다음 과 같은 매개 변수 xargs와 함께 사용할 수 있습니다 -o.

locate filename123 | xargs -o vim

-o명령을 실행하기 전에 하위 프로세스에서 stdin을 / dev / tty로 다시여십시오. 이는 xargs가 대화식 응용 프로그램을 실행하도록하려는 경우에 유용합니다.

또는 Linux에서는 다음을 사용하여 다음 해결 방법을 시도하십시오.

locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'

다른 명령을 사용 하는 경우 다음과 같이 명령 대체 를 사용 하여이를 수행하십시오.

vim $(locate filename123)
vim `locate filename123`

또는 다음과 같이 tty 할당을 강제 parallel로 수행 xargs하는 대신 GNU 를 사용하십시오 .

locate filename123 | parallel -X --tty vi

참고 : parallelUnix / OSX에서는 매개 변수가 다르고 tty를 지원하지 않으므로 작동하지 않습니다.

잘 (등 다른 많은 인기 명령은 의사 청각 장애 할당을 제공 -t에서 ssh), 그래서 도움이 있는지 확인합니다.

다른 제안은 vipeVim 명령 파이프를 사용하거나 다음과 같은 간단한 스크립트를 사용하는 것입니다.

#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"

관련 :

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.