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

4
一个shell脚本,用于显示两个不同目录中多个文件的差异,并可能创建一个包含所有不匹配位置的输出文件。
条件:
  1. 将dir1/file1与dir2/file1进行比较(其他文件类似-file2与file2进行比较)

  2. 如果发现任何更改:状态应为“例如,在文件file1中找到了不匹配”,并且对于所有其他文件也应执行相同操作,并将所有结果写入一个文件中。

提前感谢。
2个回答

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

输出的格式应符合patch命令的要求。您可以将其保存在文件中,并使用该文件对dir1进行更改。
diff -ur dir1 dir2 > my.patch
cd dir1
patch -p1 < ../my.patch

`#!/bin/bash diff -ur /tmp/testr/adir1 /tmp/test/adir2 >my.patch cd /tmp/anwar/adir1 patch -p1<../my.patchbash-3.2$ bash files-compare patch: **** Only garbage was found in the patch input` - user3750136
在这种情况下应该使用补丁-p2。 - hek2mgl
谢谢 - 我刚刚尝试了使用-p2补丁,但结果相同 - 不确定为什么。 - user3750136
我更感兴趣查看那些出现不匹配的文件(无论是文件大小还是计数差异)。 - user3750136
diff 命令的输出可以被修改和格式化。你需要查看 man diff 的帮助文档,并且尝试一些选项。 - hek2mgl

0
如果你处理文本文件并且只想查看差异,我会像hek2mgl建议的那样自定义diff输出。但是如果你想要更多的控制,例如在找到不同的文件后执行一些命令或者必须比较二进制文件,你可以利用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"

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

谢谢您的建议 - 我尝试运行此程序,我想比较两个目录,但是我遇到了一些错误,不确定问题出在哪里 - 我知道我在dir2中有文件,但它仍然报错dir2 dirbash-3.2$ ./file-comp-latest 无法比较文件,可能缺少dir2/file2 无法比较文件,可能缺少dir2/file9 无法比较文件,可能缺少dir2/file1 无法比较文件,可能缺少dir2/file3 - user3750136
我在发布之前已经在测试数据上检查了脚本,所以没问题。现在,你必须找出为什么它在你的数据中表现出这样的行为。试着理解程序的流程。输出意味着cmp抛出了一个错误。移除--quiet开关。在之前添加一些echo语句,以查看$f1$f2中有什么。使用相同的参数直接从终端运行cmd语句。继续。 - dr_agon
好的。现在它对我有效了。非常感谢您的帮助。然而,需求有些变化,我正在尝试实现,但不确定如何去做。这是情况: 我需要按以下方式向脚本传递四个参数:<script> <ArchiveDir> <SourceDir> <zipFilefromArchivedir> <non-zipfilefromsource> 我的目标是能够比较archivedir和sourcedir中的文件,而archivedir中的文件是.gz格式,然而sourcedir中相同的非zip文件 - 不确定如何去做。有什么想法吗? - user3750136

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接