我有以下目录结构LINUX
在每个文件夹(除了 home)中,都有一个名为myfile.xml
我想比较(最好使用diff
)所有myfile.xml
文件。所以,我希望代码自动进入所有子目录(尽可能深入)并查找myfile.xml
和比较它们。它还可以将所有文件与其中 1 个文件进行比较。我找不到如何做到这一点。
提前致谢
我有以下目录结构LINUX
在每个文件夹(除了 home)中,都有一个名为myfile.xml
我想比较(最好使用diff
)所有myfile.xml
文件。所以,我希望代码自动进入所有子目录(尽可能深入)并查找myfile.xml
和比较它们。它还可以将所有文件与其中 1 个文件进行比较。我找不到如何做到这一点。
提前致谢
选择其中一个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
或其他东西)。