La consola de Linux – comparar dos directorios

En más de una ocasión te habrás encontrado con la necesidad de tener que comparar el contenido de dos directorios, por ejemplo para ver qué fichero falta en uno de los directorios. Yo suelo usar el siguiente script:

(Yo lo tengo guardado en un fichero llamado compara en un directorio incluido en el PATH; para poder ejecutarlo desde cualquier sitio).

El trabajo principal lo hace el comando comm, que compara dos ficheros y muestra las diferencias entre ellos. En este caso compara dos ficheros que contiene cada uno el listado de un directorio.

Por ejemplo tengo el directorio dir1 que contiene:

y el directorio dir2 que contiene:

Para comparar los directorios uso lo siguiente:

y muestra el siguiente resultado:

En la primera fila tenemos los ficheros que están únicamente en el primer directorio, en el segundo tenemos los que están en el segundo directorio. Por último nos muestra los ficheros que se encuentran en ambos directorios.

El comando comm permite además las siguientes opciones:
-1 no muestra la columna correspondiente al fichero 1.
-2 no muestra la columna correspondiente al fichero 2.
-3 no muestra la columna común.

Así, si no queremos que aparezcan los ficheros presentes en ambos directorios usaremos:

Por comodidad yo uso el script anterior siempre con la opción 3 activada:

7 thoughts on “La consola de Linux – comparar dos directorios”

  1. Muy bueno el script, pero encontré un problema.. es que si vos tratas, en mi ejemplo, comparar directorios pero de medios extraíbles (cd’s o dvd’s) aparece un error informándote que no se puede crear el archivo «.listado»

    ¿ Como se podría solucionar ?

    Muchas gracias

  2. El problema es que esos medios extraíbles son de sólo lectura. Podrías modificar el script para que el fichero .listado se creara en otra carpeta donde tengas permisos. Por ejemplo /home/gorka.

  3. Hola de vuelta.. ya pude arreglarlo

    Pero tengo otra consulta. Me quedé entusiasmado con esto de los scripts y decidí intentar hacer uno.

    tree $1 >> /home/kano/cds_musica.txt

    Este lo que hace es listar todos los archivos del medio que le ordene yo y los vuelca en el archivo correspondiente. Pero el problema es que quiero que siempre los guarde en ese archivo pero que cuando los guarde le agregue una linea de texto que diga «musica 1» o «musica 2» y luego escriba. Hay alguna manera de hacerlo??

    muchas gracias

  4. Hola, que ocurre si 2 archivos iguales tienen contenidos distintos? No es fiable, solo compara por nombres de archivos, alguna sugerencia mejor? Avisame en mi mail, lo necesito porque sino no tendre manera de saber tu respuesta.

  5. Prueba esto:

    #!/bin/bash

    dir1=$1
    dir2=$2

    function comparar {
    if test $# -lt 2
    then
    diff . $dir1
    else
    diff $dir1 $dir2
    fi
    }

    comparar $dir1 $dir2

  6. Muy bueno, pero necesito que sea recursivo en carpetas hacia adentro, hay forma? Idealmente, lo que necesito es que genere una salida/script que permita copiar los archivos de la 1era carpeta a los de la segunda. Se entiende? Esto lo necesito para hacer backups.
    Gracias

  7. Hola y para saber cual es el padre de 2 directorios ?? Pasado por parámetros?? Osea si el primero está dentro del otro??

Leave a Reply

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.