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

Tengo que reconocerlo: soy un fan de la línea de comandos. De la de Unix sobre todo (Linux y Mac). Aún me resulta increíble lo sencillo y rápido que es hacer las cosas con ella, evitando tener que abrir programas que tardan un mundo en cargar para hacer lo mismo. Siempre que sepas, claro.

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:

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:

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.

Únete a la conversación

15 comentarios

  1. Tienes razón hay que practicarlo un par de veces y luego comprendes, es muy efectivo. Pero yo tengo un caso que aún no encuentro la opción para generarlo, y es que necesito el archivo resultante, pero sin que le agregue identificadores a las líneas que son diferentes, es decir que se mantenga el formato original, solamente las líneas que no estan en el primer archivo.

    1. Una manera de hacerlo, pero al revés de como lo dices, o sea que te diga las líneas del archivo2 que no están en el archivo1, sería:

      awk ‘FNR==NR{old[$0];next};!($0 in old)’ archivo1 archivo2

      Saludos!

  2. Saludos, a partir de esta entrada, veo que tienes material interesante, te felicito por tu escritura y contenidos, agrega más sobre consola. Recomiendo reducir espacio de barra de navegación y poner enlaces para anterior siguiente al pie (leemos hasta el fin) tambien mira la visualización para moviles (uc-browser, va muy bien).

  3. Estimados Hay alguna forma de que cuando los archivose sean iguales pueda enviar un mensaje por ejemplo «archivos identicos»?

  4. Hola,
    tengo que comparar archivos fuentes de oracle que tienen diferencias de tabulacion e interlineado, para saber donde está la diferencia en el código.
    Tengo servidores Linux y también posibilidad de compararlos en Windows.
    Alguna herramienta que compare eliminando las diferencias básicas de tabulacion?
    Muchas gracias y buena página!

  5. Buenas amigos tengo un caso a ver si ustedes me pueden ayudar estoy utilizando el comando diff de dos archivos txt (diff archivo1.xtt archivo2.txt pero quiero obviar una columna en particular de cada uno por igual en cada archivo habra una forma de hacerlo ?? gracias

  6. y que ocurre si deseo comparar 2 archivos comprimidos identificando en detalle los archivos diferentes?

  7. Muy buenas,

    Tengo generado un .bat que, mediante diff, compara 2 ficheros .txt y me genera otro con las líneas del primer fichero que no se encuentran en el segundo.
    El problema que tengo es que en el fichero de salida no reconoce algunos caracteres como acentos, «ñ», etc y los reemplaza por otros.
    Los ficheros que comparo están codificados en ANSII, mientras que el de salida me lo genera en UTF-8.
    Mi pregunta es si hay alguna manera de indicarle en la línea de comandos que codifique la salida también en ANSII, sin tener que hacer modificaciones en la configuración del pc.
    El código de mi .bat, por si a alguien le pudiera servir :

    SET DIFFPATH=»C:\Dif\diff.exe»
    SET FILE1=C:\Ficheros\Fichero1.txt
    SET FILE2=C:\Ficheros\Fichero2.txt
    SET OUTPUTFILE=C:\Ficheros\Resultado.txt

    %DIFFPATH% –changed-group-format=»%% %OUTPUTFILE%

    Muchas gracias.

Dejar un comentario

Responder a davidochobits Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto: