Como eu gero diffs para uma série de arquivos?

1

Eu tenho uma série de alguns milhares de arquivos, todos com nomes de arquivos em ordem, então vamos dizer file1.x, file2.x, file3.x, etc. Todos esses arquivos estão no mesmo diretório.

Eu sei como gerar um diff de arquivo1.x para arquivo2.x, mas existe uma maneira que eu poderia escrever um script bash para gerar diffs de um arquivo para o próximo? Basicamente, ele faria primeiro o diff de 1 a 2, depois de 2 a 3, depois de 3 a 4, etc., até que fosse concluído.

    
por diff darrell 02.07.2015 / 05:17

2 respostas

2

O script a seguir leva um argumento como "file*.x" e o aplica a find | sort para obter uma lista de arquivos a serem processados. Com milhares de arquivos, você pode obter "muitos argumentos" em echo file*.x .

#!/bin/bash

prev=
find . -maxdepth 1 -type f -name "$1" | sort -V |
while read -r file; do
        file=${file#*/} # Remove leading ./
        if test -n "$prev"; then
                diff -u "$prev" "$file" > "${prev%.*}-${file%.*}.diff"
        fi
        prev="$file"
done

Sessão de amostra:

$ echo a > file1.x
$ echo b > file2.x
$ echo c > file3.x
$ echo d > file5.x
$ echo e > file10.x
$ ./script.sh "file*.x"
$ ls *.diff
file1-file2.diff  file2-file3.diff  file3-file5.diff  file5-file10.diff
    
por 02.07.2015 / 05:50
1

O script de shell a seguir, quando fornecido um argumento da forma file1.x , gera uma série de diferenças. Ele incrementa a última série de dígitos no nome do arquivo (assim você pode começar em file0.x ou file42.x ) e continua até encontrar um número ausente.

#!/bin/sh
current=$1
suffix=${1##*[0-9]}; digits=${1%"$suffix"}
digits=${digits##*[!0-9]}; prefix=${1%"$digits$suffix"}
while
  leading_zeros=${digits%%[1-9]*}; digits=${digits#$leading_zeros}
  case $digits in
    *[!9]*) digits=$leading_zeros$((digits+1));;
    *) digits=${leading_zeros%0}$((digits+1));;
  esac
  next=$prefix$digits$suffix
  [ -e "$next" ]
do
  diff -u -- "$current" "$next" >"$next.diff"
  current=$next
done

Em vez de gerar um monte de diffs, pode ser mais conveniente inserir as versões no controle de versão e usar boas ferramentas de VC para explorar as revisões sucessivas. Para fazer isso, inicialize o controle de versão (por exemplo, git init ), adicione o arquivo inicial (por exemplo, cp file1.x file.x && git add file.x && git commit -m "version 1" ) e, em vez de gerar diffs (a linha diff no script acima) confirme as versões sucessivas (por exemplo, cp -- "$next" "$prefix$suffix" && git commit -m "Version $digits" -- "$prefix$suffix" ).

    
por 02.07.2015 / 09:21