在许多目录和子目录中比较(差异)具有相同名称的不同文件

时间:2013-10-08 16:23:43

标签: bash compare diff subdirectory

我在LINUX

中有以下目录结构

enter image description here

在每个文件夹(家庭除外)中,都有一个名为myfile.xml

的文件

我想比较(最好使用diff)所有myfile.xml个文件。因此,我希望代码能够自动进入所有子目录(尽可能深入)并查找myfile.xml并进行比较。它还可以将所有文件与其中一个文件进行比较。我找不到怎么做。

先谢谢

1 个答案:

答案 0 :(得分:2)

选择其中一个xml个文件,说它是home/hello/myfile.xml。然后运行find(假设您位于home上方的文件夹中):

find home -name "myfile.xml" -print -exec diff home/hello/myfile.xml {} \; 

这会将home/hello/myfile.xml与其他每一个进行比较,并在每个diff输出前面加上要比较的文件的路径名。

如果你想要一种以编程方式获取第一个文件的方法,你可以这样做:

basexml=$(find home -name "myfile.xml" | head -1)
find home -name "myfile.xml" -print -exec diff $basexml {} \; 

如果您想在差异输出之前显示一条显示差异的消息(并且仅在存在差异的情况下),那么您可以创建一个小的shell脚本,如下所示:

dout=$(diff $1 $2)

if [ ! "$?" = "0" ]; then
    echo "${1##*/} is different on ${1%/*} and ${2%/*}"
    echo $dout
fi

我不确定shell变量可以容纳多少限制,所以你可能需要一个临时文件:

diff $1 $2 > /tmp/$0$$

if [ ! "$?" = "0" ]; then
    echo "${1##*/} is different on ${1%/*} and ${2%/*}"
    cat /tmp/$0$$
fi

rm -f /tmp/$0$$

假设这个脚本名为sdiff.sh,那么您的find就是:

find home -name "myfile.xml" -exec sh sdiff.sh $basexml {} \;

在脚本中,我将临时文件命名为$0$$,这是脚本的名称,后跟进程ID。因此,名称将显示为/tmp/sdiff.shXXXXX,其中XXXXX是进程ID。在这种情况下,我可能不一定是那种“幻想”(我们可能只是称它为$0.tmp或其他东西)。