나는 파일 이름이 있다고 가정 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.
답변
당신은 사용할 수 있습니다 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
를 구분자 로 지정하는 다른 방법도 확인하십시오 .)
답변
명령 확장을 사용할 수 있습니다.
vi "$(locate filename123 | head -n1)"
vim
stdin을 읽으 려면 할 수 vim -
있지만 출력 locate
은 파일 이름 경로입니다. vim
gf
정상적인 명령을 사용 하면 커서가있는 경로가 열립니다.
편집하다
파일 이름에 공백이 있으면 xargs
위에서 언급 한 옵션이나 vim
솔루션 을 사용하는 것이 좋습니다 . 메이크업의에 참고 gf
작품은 당신에게 공간을 추가해야합니다 isfname
:
set isfname+=32
편집 2
의견head
에 PeterO가 제안한대로 따옴표를 추가했습니다 .
답변
가장 간단한 방법은 다음 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
참고 : parallel
Unix / OSX에서는 매개 변수가 다르고 tty를 지원하지 않으므로 작동하지 않습니다.
잘 (등 다른 많은 인기 명령은 의사 청각 장애 할당을 제공 -t
에서 ssh
), 그래서 도움이 있는지 확인합니다.
다른 제안은 vipe
Vim 명령 파이프를 사용하거나 다음과 같은 간단한 스크립트를 사용하는 것입니다.
#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"
관련 :
- Vim SE에서 xargs를 사용 하여 Vim 을 호출 한 후 터미널이 중단됨