SGCG

…esto no es un subtítulo…

Ir a: contenido categorías calendario archivo suscripción

Volver arriba

*nix en casos prácticos: comparar dos directorios

2012-03-08

Llega otra entrega de *nix en casos prácticos, la serie de artículos sobre usos y técnicas de sistemas *nix en general y de la potente línea de órdenes en particular. Hoy vamos a ver cómo comparar rápidamente dos directorios para encontrar qué ficheros están repetidos y qué ficheros aparecen sólo en uno de los directorios.

*nix en casos prácticos no es un curso para absolutos principiantes, sino que está pensado para estimular la curiosidad de quien ya tiene una mínima capacidad de autodefensa en la línea de órdenes y puede comprender los ejemplos (¡aunque sea con la ayuda de un manual!) y, con un poquito de inventiva, crear sus propias soluciones para problemas semejantes a los presentados.

El problema

Digamos que tenemos dos directorios: local e intercambio. El directorio local está en el disco duro de nuestro ordenador y el directorio intercambio reside en un dispositivo de almacenamiento portátil que usamos para intercambiar material con nuestros amigos. Ambos directorios están repletos de fotografías de nuestra última aventura. La cantidad de datos es tan grande que la única forma viable de distribuir las fotografías entre nuestros amigos es a base de poner en circulación el dispositivo de almacenamiento portátil. Este dispositivo ha vuelto a nuestras manos después de pasar varios días de un amigo al siguiente y queremos ver si hay las mismas fotos que antes, ya que podría ser que alguien hubiera añadido alguna imagen de su cosecha y tocara volver a poner a circular el dispositivo para que todos tengan acceso a todas las fotografías. También podría suceder que alguien hubiera borrado alguna imagen sin darse cuenta y tuviéramos que volver a añadirla al dispositivo. Hay tres piezas de información que pueden interesarnos:

  1. las fotografías que sólo están en local;
  2. las fotografías que sólo están en intercambio;
  3. las fotografías que están en ambos sitios.

Hay varias formas de obtener estos datos. Veamos una.

La solución

Vamos a sacar el listado de ficheros del directorio local y el listado de ficheros del directorio remoto, de modo que podamos comparar qué hay en un sitio con lo que hay en el otro. ¡Es muy fácil!

El primer paso consiste en listar el contenido de local. Para no complicarnos, suponemos que local es una ruta accesible directamente desde nuestro directorio de trabajo. Visitemos local:
cd local
Ahora, listemos el contenido y volquemos este listado en un lugar donde no estorbe (digamos /tmp/local, un fichero dentro de /tmp, el directorio para datos temporales):
find . -type f | sort > /tmp/local
Sólo hemos listado los ficheros (incluidos los que están en posibles subdirectorios), pero no los nombres de directorio que puede haber. Filtramos el contenido con sort para tenerlo por orden alfabético, lo que permitirá hacer una comparación muy rápida y fácil más adelante. Tras esto, volvemos al directorio en el que estábamos antes:
cd -
Recordemos que si pasamos - como simple argumento de cd, volvemos al directorio en el que estábamos antes.

El segundo paso es análogo al anterior, pero ahora con el directorio intercambio, que también suponemos que es accesible directamente:
cd intercambio
find . -type f | sort > /tmp/intercambio
cd -

Ahora que tenemos los listados /tmp/local y /tmp/intercambio, podemos compararlos cómodamente. Haremos uso de la herramienta comm, un programa que sirve para comparar dos ficheros de texto ordenados línea por línea. A comm hay que decirle qué queremos omitir mediante unos argumentos:

Por lo tanto:

  1. Para mostrar lo que está únicamente en el listado /tmp/local, tenemos que omitir lo que está en sólo en /tmp/intercambio y lo que está en ambos listados a la vez:
    comm -2 -3 /tmp/local /tmp/intercambio
  2. Para mostrar lo que está únicamente en el listado /tmp/intercambio, omitimos lo que está sólo en /tmp/local y lo que está en ambos listados a la vez:
    comm -1 -3 /tmp/local /tmp/intercambio
  3. Para mostrar lo que está en ambos listados simultáneamente, omitimos lo que sólo está en /tmp/local y lo que sólo está en /tmp/intercambio:
    comm -1 -2 /tmp/local /tmp/intercambio

¡Ya está! En función de nuestras necesidades, podemos hacer muchas cosas distintas con estos resultados.


Categorías: Informática

Permalink: http://sgcg.es/articulos/2012/03/08/unix-en-casos-practicos-comparar-dos-directorios/