Diff 命令仅比较第一个目录中的文件

Diff 命令仅比较第一个目录中的文件

我有 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 --briefdiffruni dest source --unified
前两个参数是需要比较的文件夹,之后的任何参数都被视为选项diff

我发现其他建议在用于大树时会产生过多的输出,或者使用诸如 之类的选项会失败--unified

相关内容