1

我有以下目录结构LINUX

在此处输入图像描述

在每个文件夹(除了 home)中,都有一个名为myfile.xml

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

提前致谢

4

1 回答 1

2

选择其中一个xml文件,说它是home/hello/myfile.xml. 然后运行一个find(假设你在上面的文件夹中home):

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

这将home/hello/myfile.xml与其他每个比较,并在每个差异输出之前加上被比较文件的路径名。

如果您想要一种以编程方式获取第一个文件的方法,您可以执行以下操作:

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。因此名称将显示为进程 ID/tmp/sdiff.shXXXXX所在的位置。XXXXX在这种情况下,我可能不必那么“花哨”(我们可以直接称呼它$0.tmp或其他东西)。

于 2013-10-08T16:28:42.920 回答