比较Linux中两个不同目录中的文件

时间:2016-11-14 18:04:41

标签: linux bash shell unix file-diffs

一个shell脚本,它显示两个不同目录中多个文件的差异,还可能创建一个输出文件,包括找到所有不匹配的位置。

条件

  1. 文件dir1 / file1仅与dir2 / file1进行比较(类似于其他文件 - file2与file2比较)

  2. 如果发现任何更改:状态应为“文件file1中的Miss-match FOUND”,同样的事情应该对所有其他文件执行并将所有结果写入一个文件

  3. 提前致谢

2 个答案:

答案 0 :(得分:1)

使用diff命令。使用-r标志,您可以递归地比较文件夹:

diff -ur dir1 dir2

输出将采用patch命令理解的格式。您可以将其保存在文件中,然后使用

将这些更改应用到dir1
diff -ur dir1 dir2 > my.patch
cd dir1
patch -p1 < ../my.patch

答案 1 :(得分:0)

如果您处理文本文件并希望只看到差异,我会自定义diff输出,正如hek2mgl建议的那样。但是,如果您想要更多控制,例如在找到不同文件后执行某些命令,或者您必须比较二进制文件,则可以使用findcmp。 以下是您可以自定义的示例:

#!/bin/bash
IFS_SAVE="$IFS"
IFS=$'\x0a'

for f in $(find dir1 -type f -printf "%f\n"); do {
    f1="dir1/$f"
    f2="dir2/$f"
    cmp --quiet "$f1" "$f2"
    check=$?
    if [ $check -eq 0 ] ; then
        echo -e "OK: $f"
    elif [ $check -eq 1 ] ; then
        echo -en "Mismatch FOUND in files: "
        filesize1=$(stat --printf="%s" "$f1" )
        filesize2=$(stat --printf="%s" "$f2" )
        echo "$f1" size:"$filesize1" "$f2" size:"$filesize2" check:"$check" 
        #you may put diff ... or anything else here
    else 
        echo "cannot compare files, probably $f2 is missing"
    fi
} ; done
IFS="$IFS_SAVE"

根据您的情况(如果文件名不包含空格,没有丢失的文件等),您可以省略某些部分 - 这只是从较大的脚本中定制的。