我有 2 个文件夹,我想比较它们的内容。例如,我有文件夹 1 和文件夹 2。文件夹 2 有很多新文件 + 一些与文件夹 1 相同的文件,但这些文件的内容有一些变化。现在,我想比较文件夹 1 和文件夹 2,以获取文件夹 2 中已更改或丢失的文件夹 1 文件列表。
当我运行以下命令时:
diff --brief -r folder1/ folder2/ > diff.txt
它还为我提供了文件夹 2 的新文件列表。
我想比较文件夹 1 和文件夹 2,以获取文件夹 1 中在文件夹 2 中丢失或更改的文件列表。
我怎样才能实现这个目标?
请不要推荐Meld
,我已经尝试过了,但没用。我想,命令行会更快。
更新
find folder1 -type f -exec diff --brief --from-file=folder2 {} +
没有给我不同/丢失文件的完整文件路径。
答案1
该--from-file
选项可能有用:
$ diff -r --brief foo bar
Files foo/a and bar/a differ
Files foo/b and bar/b differ
Files foo/c and bar/c differ
Only in bar: d
$ diff --brief --from-file=bar foo/*
Files bar/a and foo/a differ
Files bar/b and foo/b differ
Files bar/c and foo/c differ
因此,就你的情况而言,情况应该是:
diff --brief --from-file=folder2 folder1/*
还有以下--unidirectional-new-file
选项:
--unidirectional-new-file
treat absent first files as empty
用它:
$ diff /tmp/foo/ /tmp/bar -r --brief --unidirectional-new-file
Files /tmp/foo/a and /tmp/bar/a differ
Files /tmp/foo/b and /tmp/bar/b differ
Files /tmp/foo/c and /tmp/bar/c differ
答案2
以下工作:
diff --brief -r folder1/ folder2/ | grep folder1/ > diff.txt
答案3
为了进行递归、单边和高效的比较,这个 shell 函数是一个很好的通用解决方案:
function diffruni {
local a="$1" b="$2"
shift 2
# get relative paths, protected by nul, and iterate them
find "$b/" -printf '%P\0' | while IFS= read -d '' path; do
# Give an error like diff's when destination side doesn't exist
if ! [ -e "$a/$path" ]; then
echo "Only in $b: $path"
# don't double-compare entire directory contents
elif ! [ -d "$b/$path" ]; then
diff "$@" "$a/$path" "$b/$path"
fi
done
}
用法:diffruni dest source --brief
或diffruni dest source --unified
前两个参数是需要比较的文件夹,之后的任何参数都被视为选项diff
。
我发现其他建议在用于大树时会产生过多的输出,或者使用诸如 之类的选项会失败--unified
。