Linux에서 vi에서 find로 반환 된 모든 파일을 편집하려면 어떻게해야합니까?


27

내가 많이 많이 찾은 것은 find 명령을 실행 한 다음 vi에서 모든 명령을 편집하는 것입니다.

> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt

> vi ./file1.txt ./file2.txt ./path/to/file3.txt

하나의 명령 줄에서이 모든 작업을 수행하는 영리하고 간단한 방법이 있습니까?


1
vi : find로 파이프 할 수 있습니다. "* .txt"| xargs vi
MaQleod

1
@MaQleod : 기술적으로 xargs 로 파이핑 할 것 입니다.
grawity


xargs쉘 터미널 을 파괴 하기 위해 배관 . 적절한 해결책은 아래 @ @DevSolar의 솔루션입니다
typelogic

답변:


41

트릭을 수행해야합니다.

find . -name "*.txt" -exec vim {} + 

Vim을 사용하면 건강에 좋습니다. :-)

간과되는 +옵션으로 -exec모든 파일 이름 (최대 행 길이 제한)을 한 줄에 표시 할 수 있습니다. 즉, vim 세션 에서 열린 모든 파일을 계속 볼 수 있습니다 ( :n다음 및 :N이전 파일로 이동).

함께 vim -p사용하면 각 파일의 파일 탭을 얻는다. :help tab-page-commands자세한 내용을 확인 하십시오.

함께 vim -o사용하면, 각 파일에 대해 수평 분할 창을 얻을 것이다 vim -O수직 분할 창을. :help window-move-cursor자세한 내용을 확인 하십시오.

이 답변의 이전 버전은 vim $(find . -name "*.txt")파일 이름의 공백과 함께 작동하지 않으며 보안에 영향을 미칩니다.

파이핑 xargs viWarning: Input is not from a terminal이후에 완전히 가짜 행동을하는 터미널 을 제공합니다 . 사용자 grawity는 아래 주석에서 이유를 설명 하고이 질문 에 약간 더 설명했습니다 .


4
vim에 대해 얼마나 많이 알고 있는지 모르지만 : n은 다음 파일을, : N은 이전 파일을 나타냅니다.
zpletan

4
@DevSolar : Vim은 stdin이 제어 터미널과 동일 할 것으로 기대하고 stdin에서 다양한 터미널 관련 ioctl을 직접 수행합니다. (당신이 버그를 고려할 수 빔 확실히. 열고 /dev/tty그에서 통화의 ioctl ();. 그것을 할 너무 게으른) xargs를 호출 할 때, 정력 수신 /dev/null단지 터미널 제어하는 IOCTL을 무시 표준 입력으로.
grawity

3
@zpletan : vim -p파일 탭을 원할 경우. ( gtgT탐색하거나 마우스로 클릭하십시오.)
grawity

2
참고로로 연결할 때 경고를 피하려면 에서처럼 첫 번째 인수로 vim지정 -하십시오 echo foobar | vim -.
Konrad Rudolph

2
@Konrad Rudolph : OP가 요청한 것이 아닌 찾은 파일 find . -name "*.txt" | vim -이름 이 포함 된 이름 없는 파일에 대한 vim 세션을 제공합니다 .
DevSolar


1

또한 한 번에 하나씩 열려면 find -exec를 사용하거나 간단한 for 루프를 사용할 수도 있습니다. 의견을 편집했습니다.

find . -name "*.txt" -exec vi {} \;

또는

OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for i in `find . -name "*.txt"`
    do
        vi $i
    done
IFS=$OLDIFS

...하지만 왜 그렇게 하시겠습니까?
DevSolar

@DevSolar 첫 번째는 찾기 기능을 가리키고, 두 번째는 범용 루프입니다. 편집하기 전에 모든 파일에 대해 무언가를하고 싶을 수도 있습니다.
OldWolf

두 번째 시도한 적이 있습니까? 첫째 : 찾기는 현재 디렉토리가 없기 때문에 리턴합니다 -name. 둘째 : 파일 이름에 공백이 포함되면 명령이 비참하게 실패합니다. 잘못된 조언을 얻으려면 -1입니다.
9:16에 sep

실제로 파일 이름의 공백 주제는 내 대답에도 적용됩니다. 명령 줄에서 자체 스크립트로 바꾸지 않고 제대로 처리하는 방법조차 생각할 수 없습니다. 파일 이름의 공백이 권장되지 않는 좋은 이유가 있습니다.
DevSolar

@ceving 유효한 포인트입니다. 나는 원래의 포스터가 그의 필요에 맞다고 생각했다. 편집.
OldWolf

0

이미 find명령을 입력 한 xargs경우 검색 결과를 여는 것이 훨씬 더 쉽다는 것을 알았습니다 .

find . -name "*.txt" | xargs vim -p

-p옵션은 vim에게 각 파일을 새 탭에서 열도록 지시합니다. 버퍼를 사용하는 것보다 이것이 더 편리하다는 것을 알지만 그렇지 않으면 해당 옵션을 생략하십시오.


내 명령을 찾을 수 있도록 연결해 주셔서 감사합니다. locate filename | xargs vim -p
talsibony

0

모두 편집하려면 다음을 *.txt실행하면 vim *.txt됩니다.. 에서 반환 한 파일을 편집하려면 find추가 정보를 읽으십시오.


유닉스 / 맥 OS에, 당신은 사용할 수 findBSD와 xargs(참조 man xargs, 예를 들어)

find -L . -name "*.txt" -type f -print0 | xargs -o -0 vim

-o( xargs) : 명령을 실행하기 전에 하위 프로세스에서 stdin을 / dev / tty로 다시여십시오.

관련 : Vim.SE에서 xargsVim을 호출 한 후 터미널이 중단되었습니다.

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