我试图创建一个sh,它生成一个报告,显示两个文件夹/java项目中文件的差异。我使用的是dwdiff,我只需要每次比较的最后一行(我不在乎差异,百分比是我需要的)。我已经创建了以下脚本:
DEST_FOLDER='./target/'
CLASSES_P1='classesP1.txt'
CLASSES_P2='classesP2.txt'
DEST_FILE='report.txt'
rm -r "$DEST_FOLDER"
mkdir -p "$DEST_FOLDER"
rm -f "$DEST_FOLDER/$CLASSES_P1"
rm -f "$DEST_FOLDER/$CLASSES_P2"
rm -f "$DEST_FOLDER/$DEST_FILE"
find ./p1 -name "*.java" >> "$DEST_FOLDER/$CLASSES_P1"
find ./p2 -name "*.java" >> "$DEST_FOLDER/$CLASSES_P2"
while read p; do
while read t; do
dwdiff -s $p $t | tail --lines=0 >> "$DEST_FOLDER/$DEST_FILE"
done < $DEST_FOLDER/$CLASSES_P2
done < $DEST_FOLDER/$CLASSES_P1
它工作正常,但结果不会重定向到给定的文件。文件已创建,但为空,每个dwdiff结果的最后一行将显示到控制台。有什么想法吗?
最佳答案
有一些事情正在发生
您想要的输出是stderr
,而不是stdout
。您可以使用2>&1
命令将它们与dwdiff
合并
您想要的输出实际上似乎是由dwdiff
首先打印的,但是由于两个不同的输出,您看到的顺序不同。所以你想要head
而不是tail
你想要1行,而不是0
所以尝试dwdiff -s ... 2>&1 | head --lines=1
$ dwdiff -s /etc/motd /etc/issue 2>&1 | head --lines=1
old: 67 words 3 4% common 2 2% deleted 62 92% changed
或者,如果希望使用
new
行而不是旧行,并简化排序,请尝试放弃diff输出: $ dwdiff -s /etc/motd /etc/issue 2>&1 1>/dev/null | tail --lines=1
new: 5 words 3 60% common 0 0% inserted 2 40% changed
请注意,重定向的顺序很重要:首先将
stdout
克隆到stderr
,然后将stdout
重定向到/dev/null
。