Подтвердить что ты не робот

Как получить отчет о новых, измененных и удаленных строках

Я хочу иметь сводку разницы между двумя файлами. Ожидаемый результат - количество новых, удаленных и измененных строк. Имеет ли diff возможность такого вывода? Если нет, существует ли доступная script/утилита, которая помогает в получении сводки.

4b9b3361

Ответ 1

Если вы используете diff -u, он будет генерировать единый diff, у которого есть строки, которым предшествуют + и -. Если вы передаете этот вывод через grep (чтобы получить только + или -), а затем в wc, вы получите счетчики для + es и-es соответственно.

Ответ 2

Я думаю, вы ищете diffstat. Просто подключите вывод diff к diffstat, и вы должны получить что-то вроде этого.

 include/net/bluetooth/l2cap.h |    6 ++++++
 net/bluetooth/l2cap.c         |   18 +++++++++---------
 2 files changed, 15 insertions(+), 9 deletions(-)

Ответ 3

Для тех, кто использует Git или Mercurial, быстрый способ увидеть такое краткое изложение нестационарных изменений:

git diff --stat
hg diff --stat

Ответ 4

Вот script by suyasha, все правильно отформатированные с разрывами строк, с некоторыми добавленными сообщениями. Хорошая работа, суяша, должна была ответить на ваш ответ. Я бы проголосовал за это.

#!/bin/bash
# USAGE:    diffstat.sh [file1] [file2]

if [ ! $2 ]
then
   printf "\n   USAGE: diffstat.sh [file1] [file2]\n\n"
   exit
fi

diff -u -s "$1" "$2" > "/tmp/diff_tmp" 
add_lines=`cat "/tmp/diff_tmp" | grep ^+ | wc -l`
del_lines=`cat "/tmp/diff_tmp" | grep ^- | wc -l` 
# igonre diff header (those starting with @@) 
at_lines=`cat "/tmp/diff_tmp" | grep ^@ | wc -l`
chg_lines=`cat "/tmp/diff_tmp" | wc -l`
chg_lines=`expr $chg_lines - $add_lines - $del_lines - $at_lines` 
# subtract header lines from count (those starting with +++ & ---) 
add_lines=`expr $add_lines - 1`
del_lines=`expr $del_lines - 1`
total_change=`expr $chg_lines + $add_lines + $del_lines`
rm /tmp/diff_tmp

printf "Total added lines:  "
printf "%10s\n" "$add_lines"
printf "Total deleted lines:"
printf "%10s\n" "$del_lines"
printf "Modified lines:     "
printf "%10s\n" "$chg_lines"
printf "Total changes:      "
printf "%10s\n" "$total_change"