…esto no es un subtítulo…
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.
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:
Hay varias formas de obtener estos datos. Veamos una.
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:
¡Ya está! En función de nuestras necesidades, podemos hacer muchas cosas distintas con estos resultados.
Categorías: Informática
Permalink: https://sgcg.es/articulos/2012/03/08/unix-en-casos-practicos-comparar-dos-directorios/