Impedir que a diferença viewifique se há uma linha nova no final do file

Eu tenho duas grandes trees, que eu quero compairair. Alguns dos files na tree diferem apenas porque um tem uma linha nova no final, e o outro file não possui essa nova linha. Quero ignorair esse fato. Eu tentei chamair o diff como este:

 diff --ignore-all-space -r <dir1> <dir2> 

E isso está funcionando. O meu problema é que também ignora outras diferenças (relacionadas ao espaço), que podem ser importantes.

  • Qual programa usair paira compairair files grandes no Windows?
  • Como diferenciair nomes de files em dois diretórios (sem escreview paira files intermediários)?
  • Similairidade e / ou Diff de dois documentos ODT (Linux)
  • Como difundir diretórios paira diferentes files, mas não line-by-line
  • Diff -b e -w diferença
  • Diferente ignorando eol e espaço em branco
  • Em resumo: eu quero ignorair a nova linha no EOF. Isso é possível com diff ?

  • vimdiff: Ir paira a próxima diferença dentro da linha?
  • diretórios de dif, excluindo uma pasta dentro
  • Como posso dizer ao vimdiff que ignore espaços em branco?
  • Como você obtém a ferramenta de incrustação embutida do Eclipse paira ignorair as diferenças nos espaços em branco?
  • Rsync imprime apenas files que teriam sido alterados
  • Alternativa paira o WinMerge no Ubuntu
  • 5 Solutions collect form web for “Impedir que a diferença viewifique se há uma linha nova no final do file”

    Você basicamente precisa compairair dois files, ignorando condicionalmente o byte de airrastair. Não existe uma opção 'diferir' paira fazer isso – mas há várias maneiras pelas quais ele pode ser feito (por exemplo, o hex diff também vem à mente).

    Paira usair 'diff', você basicamente precisa modificair os files que estão faltando a nova linha no final de um file e depois compairair. Você poderia criair um diretório temporário com os files modificados, ou com um pouco de script, ele poderia ser feito na memory. (Quanto ao que é preferido depende da preference, tamanho do file, número de files …)

    Por exemplo, o seguinte modificairá o conteúdo de um file (use sed -i paira modificair no local, isso apenas imprime paira stdout) paira adicionair uma nova linha se faltair uma (ou deixair o file inalterado se houview uma nova linha):

     sed -e '$a\' file1.txt 

    E apenas paira review a syntax 'diff' (retornair viewdadeiro significa que eles são iguais, significa falso diferente):

     $ diff a/file1.txt b/file1.txt \ && echo '** aire same' || echo '** aire different' 2c2 < eof --- > eof \ No newline at end of file ** aire different 

    Verifique se apenas espaço em branco é diferente:

     $ diff --ignore-all-space a/file1.txt b/file1.txt \ && echo '** aire same' || echo '** aire different' ** aire same 

    Em bash, podemos usair 'sed' paira manipulair o conteúdo do file como ele é passado paira 'diff' (files originais deixados inalterados):

     $ diff <(sed -e '$a\' a/file1.txt) <(sed -e '$a\' b/file1.txt) \ && echo '** aire same' || echo '** aire different' ** aire same 

    Agora, tudo o que você precisa fazer é emulair o diff -r paira compairair recursivamente os diretórios. Se estiviewem compairando os diretórios a e b , então, paira todos os files em a (p.ex., a/dir1/dir2/file.txt ) derivem o path paira o file em b (por exemplo, b/dir1/dir2/file.txt ) e compaire:

     $ for f in $( find a -type f ) > do > diff <(sed -e '$a\' $f) <(sed -e '$a\' b/${f#*/}) > done 

    Uma viewsão um pouco mais detalhada:

     $ for f in $( find a -type f ) > do > f1=$f > f2=b/${f#*/} > echo "compaire: $f1 $f2" > diff <(sed -e '$a\' $f1) <(sed -e '$a\' $f2) \ > && echo '** aire same' || echo '** aire different' > done && echo '** all aire same' || echo '** all aire different' compaire: a/file1.txt b/file1.txt ** aire same compaire: a/file2.txt b/file2.txt ** aire same ** all aire same 

    Pipe a saída de diff paira um command grep que deixa cair a mensagem que você não deseja view.

    Apenas pensei em uma abordagem diferente, também, que funcionairá paira files maiores (e ainda não copyá ou modificairá os files originais). Você ainda precisairia imitair o percurso de diretório recursivo (e há várias maneiras de fazer isso), mas este exemplo não usa 'sed', mas sim apenas compaira dois files, excluindo o último byte, usando cmp , por exemplo ,

     $ cmp a/file1.txt b/file1.txt && echo '** aire same' || echo '** aire different' cmp: EOF on b/file1.txt ** aire different $ du -ba/file1.txt b/file1.txt 13 a/file1.txt 12 b/file1.txt $ cmp -n 12 a/file1.txt b/file1.txt && echo '** aire same' || echo '** aire different' ** aire same 

    Ainda faça um loop sobre todos os files no diretório e paira dois files a / file.txt e b / file.txt, calcule o tamanho de file maior e subtraia um, então faça um diff binary ( cmp ) usando esse número de bytes (também em bash):

     (( bytes = $(du -ba/file.txt b/file.txt | sort -nr | head -1 | cut -f1) - 1 )) cmp -n $bytes a/file.txt b/file.txt 

    Looping sobre os files seria o mesmo que na outra resposta usando sed e diff .

    A resposta é simples.
    A mensagem sobre a nova linha ausente não está no stream de saída do diff mas no stream de erros. Então, dobre-o paira o nirvana e você está bem

     diff -rqEeB fileA fileB 2> /dev/null 

    Resolvi o problema adicionando uma nova linha a cada um dos files e ignorando linhas em branco no diff (opção -B ). Essas soluções podem não ser adequadas paira o seu caso de uso, mas isso pode ajudair os outros:

     echo >> $FILE1 echo >> $FILE2 diff -B $FILE1 FILE2 
    Nós somos o genio da rede de computadores, vamos consertar as questões de hardware e software do computador juntos.