Básicamente, necesita comparar dos archivos, ignorando condicionalmente el byte final. No hay una opción 'diff' para hacer esto, pero hay varias formas de hacerlo (por ejemplo, hexadecimal diff también me viene a la mente).
Para usar 'diff', básicamente tiene que modificar los archivos a los que les falta la nueva línea al final de un archivo, y luego compararlos. Puede crear un directorio temporal con los archivos modificados, o con un poco de secuencia de comandos se puede hacer en la memoria. (En cuanto a cuál se prefiere depende de la preferencia, el tamaño del archivo, el número de archivos ...)
Por ejemplo, lo siguiente modificará el contenido de un archivo (se usa sed -i
para modificar en el lugar, esto solo se imprime en stdout) para agregar una nueva línea si falta una (o dejar el archivo sin cambios si ya hay una nueva línea):
sed -e '$a\' file1.txt
Y solo para revisar la sintaxis 'diff' (devolver verdadero significa que son iguales, falso 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 que solo los espacios en blanco sean diferentes:
$ diff --ignore-all-space a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
** are same
En bash, podemos usar 'sed' para manipular el contenido del archivo a medida que se pasa a 'diff' (los archivos originales no se modifican):
$ diff <(sed -e '$a\' a/file1.txt) <(sed -e '$a\' b/file1.txt) \
&& echo '** are same' || echo '** are different'
** are same
Ahora todo lo que tiene que hacer es emular diff -r
para comparar directorios de forma recursiva. Si compara directorios a
y b
, para todos los archivos en a
(p. Ej. a/dir1/dir2/file.txt
) , Deriva la ruta al archivo en b
(p. Ej. b/dir1/dir2/file.txt
) Y compara:
$ for f in $( find a -type f )
> do
> diff <(sed -e '$a\' $f) <(sed -e '$a\' b/${f#*/})
> done
Una versión un poco más detallada:
$ 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
sed -e '$a\'
hace exactamente? thx