我在LINUX
在每个文件夹(家庭除外)中,都有一个名为myfile.xml
我想比较(最好使用diff
)所有myfile.xml
个文件。因此,我希望代码能够自动进入所有子目录(尽可能深入)并查找myfile.xml
并进行比较。它还可以将所有文件与其中一个文件进行比较。我找不到怎么做。
先谢谢
答案 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
或其他东西)。