Translate

Cómo comparar archivos y carpetas con el comando diff de Unix (Mac , Linux)

diff_1

En un post anterior hablé del programa Diffmerge, que permite hacer lo que pone en el título de la entrada: comparar archivos o carpetas. Y además es multiplataforma: Windows, Linux y Mac. Y viendo que es una entrada bastante visitada, y al leer un post en Lifehacker, me decidí por escribir ésto que estás leyendo.

En un post anterior hablé del programa Diffmerge, que permite hacer lo que pone en el título de la entrada: comparar archivos o carpetas. Y además es multiplataforma: Windows, Linux y Mac. Y viendo que es una entrada bastante visitada, y al leer un post en Lifehacker, me decidí por escribir ésto que estás leyendo.

Vamos a empezar explicando lo más sencillo, que es cómo comparar dos carpetas, para ver qué archivos diferentes tienen. Para ello, utilizaremos el siguiente comando:

diff -rq carpeta1 carpeta2

Donde la opción -rq indica que comparemos recursivamente (r) y sólo los archivos diferentes (q). Por ejemplo, si tenemos dos carpetas, una con un archivo más que la otra, con este comando nos lo indicará, diciéndonos qué archivo es:

diff_1-img

Como se puede ver, en la carpeta folder1 tenemos archivo1, archivo2 y archivo3, mientras que en la carpeta folder2 solo tenemos archivo1 y archivo3. Al ejecutar el comando nos indica que el archivo2 sólo está en la carpeta folder1.

Veamos el caso ahora de comparar dos ficheros para ver sus diferencias. Para ello, utilizaremos el comando

diff fichero1 fichero2

Con un ejemplo lo veremos mejor:

diff_command-img

El comando diff nos va a indicar qué pasos hay que seguir para que ambos archivos sean iguales (una manera diferente de decir que son diferentes), teniendo en cuenta que para cada diferencia encontrada nos mostrará primero el número de línea afectado de cada archivo separado por una letra indicando la acción a llevar a cabo en la línea (a: añadir, c: cambiar, d: borrar), y después las líneas afectadas, indicando con < si la diferencia está en el primer archivo y con > si está en el segundo archivo.

Puede ser un poco lioso, pero probándolo un par de veces se coge el truquillo, y nos evitamos tener que instalar programas. Además, ¿cómo lo haríamos sino al conectarnos a un servidor remoto por SSH?

Evidentemente el comando tiene más opciones, que podemos consultar en la documentación man de éste, o en la misma documentación online.


En Linux se pueden comparar dos directorios o carpetas mediante el comando diff. Por ejemplo, si ejecutamos lo siguiente:
diff directorio1 directorio2
Ésto nos indicará qué archivos están en un directorio y no en otro. En caso de que haya dos archivos con el mismo nombre y su contenido sea distinto, también se indicará.
El comando anterior tiene un inconveniente, y es que puede ser demasiado lento. Si los directorios contienen muchos archivos o si la unidad de almacenamiento es algo lenta, el proceso puede eternizarse.  Pero el siguiente comando solucionará ésto de un plumazo:
diff <(cd dir1 && find | sort) <(cd dir2 && find | sort)
Como vemos, se sigue usando el comando diff, pero en vez de comparar los archivos, compara el listado ordenado del directorio.

Si lo probáis veréis lo potente que puede llegar a ser. Podéis utilizar los comentarios si os surge alguna pregunta.

Fuentes:

0 comentarios:

Publicar un comentario