我正在编写一个脚本来递归比较两个目录并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 编译的,添加-gf
到 vim 可能对你有用。 g 选项启用 GUI,而 f 选项将其保持在前台。我还知道在它自己的 xterm 中启动 vimdiff xterm -e vimdiff "$@"
。
答案4
那个怎么样:
vim -c ":e $file1 | vnew $file2 | windo diffthis"
它打开$file1
进行编辑,然后是第二个文件。无法从标准输入读取任何内容,因此没有未命名的文件。