Você basicamente precisa comparar dois arquivos, ignorando condicionalmente o byte final. Não existe uma opção 'diff' para fazer isso - mas há várias maneiras de fazer isso (por exemplo, hex diff também é lembrado).
Para usar 'diff', você basicamente tem que modificar os arquivos que estão faltando a nova linha no final de um arquivo e, em seguida, comparar. Você poderia criar um diretório temporário com os arquivos modificados ou, com um pouco de script, poderia ser feito na memória. (Quanto ao que é preferido depende da preferência, tamanho do arquivo, número de arquivos ...)
Por exemplo, o seguinte irá modificar o conteúdo de um arquivo (use sed -i
para modificar no local, isso apenas imprime para stdout) para adicionar uma nova linha se estiver faltando (ou deixar o arquivo inalterado se já houver uma nova linha ):
sed -e '$a\' file1.txt
E apenas para rever a sintaxe 'diff' (retornar true significa que eles são iguais, false significa diferente):
$ diff a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
2c2
< eof
---
> eof
\ No newline at end of file
** are different
Verifique se apenas o espaço em branco é diferente:
$ diff --ignore-all-space a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
** are same
No bash, podemos usar 'sed' para manipular o conteúdo do arquivo conforme ele é passado para 'diff' (arquivos originais deixados inalterados):
$ diff <(sed -e '$a\' a/file1.txt) <(sed -e '$a\' b/file1.txt) \
&& echo '** are same' || echo '** are different'
** are same
Agora, tudo o que você precisa fazer é emular diff -r
para comparar diretórios recursivamente. Se comparar os diretórios a
e b
, todos os arquivos em a
(por exemplo, a/dir1/dir2/file.txt
) receberão o caminho para o arquivo em b
(por exemplo, b/dir1/dir2/file.txt
) e compararão:
$ for f in $( find a -type f )
> do
> diff <(sed -e '$a\' $f) <(sed -e '$a\' b/${f#*/})
> done
Uma versão ligeiramente mais detalhada:
$ for f in $( find a -type f )
> do
> f1=$f
> f2=b/${f#*/}
> echo "compare: $f1 $f2"
> diff <(sed -e '$a\' $f1) <(sed -e '$a\' $f2) \
> && echo '** are same' || echo '** are different'
> done && echo '** all are same' || echo '** all are different'
compare: a/file1.txt b/file1.txt
** are same
compare: a/file2.txt b/file2.txt
** are same
** all are same