如何批量“diff”文件?

时间:2014-04-24 16:59:43

标签: bash shell

我有两个目录" sampleWith"和" sampleWithout"。这两个目录都包含类似的子目录和文件结构。我如何diff相应的文件?

例如:有以下文件" sampleWith / a / index1.html"和" sampleWithout / a / index1.html"。我想diff这两个文件并将输出写入相应的文件(比如1.txt),我想对子目录中的所有文件执行此操作。我该怎么做呢?我知道我可以通过diff file1.html file2.html >> 1.txt来区分两个文件以获得1.txt的输出但我不知道如果我想跨目录区分类似文件该怎么办。我有很多我想要差异的文件,手动完成每个文件需要花费很多时间。有人可以帮忙吗?谢谢!

编辑:

diff -r dir1/ dir2/正在将其写入单个文件。有什么办法可以将输出写入不同的文件吗?

2 个答案:

答案 0 :(得分:4)

Diff可以递归地比较目录中的文件。

此命令会将sampleWith/a中的每个文件与sampleWithout/a中具有相同名称的文件区分开来:

diff -r sampleWith/a sampleWithout/a

您可以使用一些shell脚本来一次区分一个文件:

cd sampleWith;
for f in `find . -name \*.html`; do
    fn=`basename "%f"`
    other="../sampleWithout/$f"

    diff "$f" "$other" > "../$fn.diff"
done

答案 1 :(得分:2)

使用--recursive标志。

diff --recursive sampleWith sampleWithout

<强>更新

要为每对文件之间的差异创建输出文件,不同的方法更合适。

  1. 创建一个可用作帮助程序的bash脚本。称之为diff.sh。其内容如下:

    #!/bin/bash
    
    # The first argument is the file to be diff'ed.
    # The second argument is a directory where the diff output can be stored.
    first="$1"
    diffoutout_dir="$2"
    
    second="${first/sampleWith/sampleWithout}"
    
    diffoutput_file="$diffoutput_dir"/$(basename "$first").out
    
    diff "$first" "$second" > "$diffoutput_file"
    
  2. 使用finddiff.sh在目录/tmp/diff-output中获得所需的结果。

    find sampleWith -type f -exec ./diff.sh {} /tmp/diff-output \;