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:
1 2 3 4 5 |
ls $1 > $1.listado ls $2 > $2.listado comm $1.listado $2.listado $3 rm $1.listado rm $2.listado |
(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:
1 2 |
fichero_1.txt fichero_comun.txt |
y el directorio dir2 que contiene:
1 2 |
fichero_2.txt fichero_comun.txt |
Para comparar los directorios uso lo siguiente:
1 |
./compara dir1 dir2 |
y muestra el siguiente resultado:
1 2 3 |
fichero_1.txt fichero_2.txt fichero_comun.txt |
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:
1 |
./compara dir1 dir2 -3 |
Por comodidad yo uso el script anterior siempre con la opción 3 activada:
1 2 3 4 5 |
ls $1 > $1.listado ls $2 > $2.listado comm $1.listado $2.listado $33 rm $1.listado rm $2.listado |
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
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.
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
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.
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
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
Hola y para saber cual es el padre de 2 directorios ?? Pasado por parámetros?? Osea si el primero está dentro del otro??