스크립트에서 vimdiff를 사용하여 파일 비교

스크립트에서 vimdiff를 사용하여 파일 비교

vimdiff두 디렉터리를 재귀적으로 비교하고 차이점이 발견되면 실행하는 스크립트를 작성하고 있습니다 .

#!/bin/bash

dir1=${1%/}
dir2=${2%/}

find "$dir1/" -type f -not -path "$dir1/.git/*" | while IFS= read line; do
    file1="$line"
    file2=${line/$dir1/$dir2}

    isdiff=$(diff -q "$file1" "$file2")

    if [ -n "$isdiff" ]; then
        vimdiff "$file1" "$file2"
    fi
done

vim이 "입력이 터미널에서 오지 않았습니다."라는 경고를 표시하기 때문에 작동하지 않습니다. -인수를 제공해야 한다는 것은 약간 까다롭지만 어느 정도 작업 중입니다.

#!/bin/bash

dir1=${1%/}
dir2=${2%/}

find "$dir1/" -type f -not -path "$dir1/.git/*" | while IFS= read line; do
    file1="$line"
    file2=${line/$dir1/$dir2}

    isdiff=$(diff -q "$file1" "$file2")

    if [ -n "$isdiff" ]; then
        cat "$file1" | vim - -c ":vnew $file2 | windo diffthis"
    fi
done

문제는 diff 창 오른쪽에 새 파일이 있다는 것입니다. dir1의 원본 파일과 dir2의 원본 파일을 비교하고 싶습니다. 어떻게 해야 하나요?

답변1

vim그래서 vimdiff추측한 것 같다.표준 입력단말기. 스크립트에서 다음을 수행하여 이 문제를 해결할 수 있습니다.

</dev/tty vimdiff "$file1" "$file2"

답변2

다음과 같이 시도해 보세요.

#! /bin/sh

[ $# -eq 2 -a -d "$1" -a -d "$2" ] || exit 1

find "$1" -name .git -prune -o \( -type f -printf '%P\n' \) | \
    while IFS= read -r f; do
        if [ -f "$2/$f" ] && ! diff -q -- "$1/$f" "$2/$f" >/dev/null; then
            vimdiff -- "$1/$f" "$2/$f" </dev/tty
        fi
    done

위의 내용은 GNU find(1)( -printf작동용)를 가정한 것입니다.

답변3

X에서 실행 중인 경우 몇 가지 다른 트릭을 사용할 수 있습니다. vim 사본이 gui로 컴파일된 경우 -gfvim에 추가하는 것이 도움이 될 수 있습니다. g 옵션은 GUI를 활성화하고 f 옵션은 GUI를 전경에 유지합니다. 나는 또한 자신의 xterm에서 vimdiff를 시작하는 방법도 알고 있습니다 xterm -e vimdiff "$@".

답변4

어떻게에 대한:

vim -c ":e $file1 | vnew $file2 | windo diffthis"

편집을 위해 열리고 $file1두 번째 파일이 열립니다. 표준 입력에서는 아무것도 읽을 수 없으므로 이름이 지정되지 않은 파일이 없습니다.

관련 정보