¿Está caliente para que diff verifique un enlace simbólico?

En Linux uno puede usar el command diff para verificar las diferencias de files. Lo uso para verificar las diferencias en dos modules, ambos copydos en /tmp .

Sin embargo, ambos modules tienen enlaces simbólicos, que podrían no estar apuntando al file correcto, ya que los modules se han copydo al directory /tmp . Pero esto no importa. Lo que quiero verificar es si los enlaces simbólicos son los mismos.

Por ejemplo, en un module, el enlace simbólico dice

 /home/test/file1 

y en el otro el enlace simbólico dice:

 /etc/rc.d/whatever 

diff ahora arroja un error porque, en general, no puede encontrar el file. Pero quiero dejar que diff diga: "Oye, esos enlaces simbólicos no son lo mismo", independientemente de si los enlaces apuntan a files válidos o no.

Pregunta: ¿Cómo es posible que diff haga eso, es decir, que no intente seguir enlaces, sino que difiera los enlaces?

Prueba GNU diff versión 3.3 o posterior con la --no-dereference (y presumiblemente la opción recursiva):

 diff --recursive --no-dereference tree1root tree2root 

Desde la versión 3.3, GNU diff no permite desreferencer los enlaces simbólicos, pero luego compara las routes a las que apuntan.

Instale difutils GNU> = 3.3 y use la opción '–no-dereference'; no hay una opción corta para eso.

El diagnóstico será silencioso si las routes son iguales o:

 Symbolic links /tmp/noderef/a/symlink and /tmp/noderef/b/symlink differ 

si las routes son diferentes

Con las herramientas de GNU:

 diff <(cd dir1 && find . -type l -printf '%p -> %l\n'|sort) \ <(cd dir2 && find . -type l -printf '%p -> %l\n'|sort) 

Estrictamente hablando, eso no puede diferenciar entre un enlace simbólico llamado a que apunta a b -> c y uno llamado a -> b que apunta a c , sin mencionar los problemas con los nombres de file que contienen caracteres de nueva línea, pero eso hace que sea más legible salida que el más robusto:

 diff <(cd dir1 && find . -type l -printf '%p // %l\0'|tr '\n\0' '\0\n'|sort) \ <(cd dir2 && find . -type l -printf '%p // %l\0'|tr '\n\0' '\0\n'|sort) 

Allí, usamos // como el separador (que no puede ocurrir de otra manera en la salida de find para %p ) y convertimos los caracteres de nueva línea a caracteres NUL (que no pueden ocurrir en la expansión de %p ni %l ).

Si entiendo correctamente, quiere comprobar que los enlaces simbólicos apuntan al mismo destino teórico, o que si uno no es un enlace simbólico, el otro file lo vincula al mismo file. Esto debería hacer lo que quieras:

 #!/bin/bash if [[ "$(readlink -m -- "$1")" == "$(readlink -m -- "$2")" ]]; then echo "files match" else echo "files don't match" exit 1 fi 
 $ > foo $ ln -s foo bar $ ln -s foo baz $ ./script bar baz files match $ ./script bar foo files match $ ln -sf qux bar $ ./script bar foo files don't match