我试图创建一个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

09-05 22:58