获取两个目录之间的差异及其完整详细信息

获取两个目录之间的差异及其完整详细信息

我有两个目录,我需要以这种格式输出它们的差异

例子 :

DIR1 conatins :   file1
                  file2
                  file3
DIR2 contains :   file1
                  file4

输出(仅文件名,无文件内容):file1 被修改或相同,file2 被删除,file4 被添加

答案1

这是一个简单的问题,查看流行的工具diffdiff -r dir1 dir2 编辑:我把OP的问题弄错了,只获取信息文件不同,而不是如何它们不同,您需要使用以下-q选项: diff -r -q dir1 dir2

答案2

comm模拟或等工具如何join比较两组排序的输入,使用bash

# Get lists of (base-)names from both directories.
files1=( dir1/* ); files1=( "${files1[@]##*/}" )
files2=( dir2/* ); files2=( "${files2[@]##*/}" )

# Loop over these sorted lists until one of them is empty.
while [[ ${#files1[@]} -gt 0 ]] && [[ ${#files2[@]} -gt 0 ]]; do
        name1=${files1[0]}
        name2=${files2[0]}

        if [[ $name1 == "$name2" ]]; then
                # Name exists in both directories.
                printf '%s is modified or same\n' "$name1"
                files1=( "${files1[@]:1}" )
                files2=( "${files2[@]:1}" )
        elif [[ $name1 < $name2 ]]; then
                # Name exists in only first directory.
                printf '%s is removed\n' "$name1"
                files1=( "${files1[@]:1}" )
        else
                # Name exists in only second directory.
                printf '%s is added\n' "$name2"
                files2=( "${files2[@]:1}" )
        fi
done

# Handle remaining names.
if [[ ${#files1[@]} -gt 0 ]]; then
        printf '%s is removed\n' "${files1[@]}"
fi
if [[ ${#files2[@]} -gt 0 ]]; then
        printf '%s is added\n' "${files2[@]}"
fi

我使用两个bash数组来保存每个目录中找到的名称,然后进行迭代,直到其中一个数组为空。

在循环中,我将每个数组的名字相互比较。如果名称相同,则文件相同或可能已被修改(然后从两个数组中删除该名称)。

如果第一个数组中的名称排在第二个数组中的名称之前(使用 测试<),则第二个目录中缺少第一个名称。现在删除第一个数组的第一个元素。

否则,第一个目录中将缺少第二个数组中的名称。现在删除第二个数组的第一个元素。

循环结束后,其中一个数组可能仍然非空,因此如果需要,请输出该数组中的名称。

相关内容