2011-03-17 17 views
5

Hola chicos, estoy ejecutando un diff en dos directorios, recursivamente, con algunas opciones. los directorios son algo grandes, sin embargo, estoy tratando de ver las diferencias en el contenido de las carpetas, no entre los archivos, usando la opción -q (¿estoy usando esto bien?)diff recursivo es extremadamente lento - verificando los contenidos de los directorios

También he intentado rsync dry correr, eso parece tomar igual durante tanto tiempo. la salida pasa a través de sed, lo he intentado sin, no parece afectar nada. también ignoro los archivos ocultos. Creo que puedo estar mal usando diff -q para simplemente comparar el contenido de 2 directorios.

utilicé un bloque de código de otro consejo para saber cuánto tiempo solo comparando UNO de estos directorios era (1 directorio, 14 subdirectorios) y tardó 88 minutos. sin embargo, cada archivo era un programa de televisión de 30 minutos, así que si diff está comparando estos archivos, tiene sentido, pero pensé que -q haría que eso no sucediera.

Además, un directorio está montado sobre AFP, uno es un disco externo conectado por firewire. esto no importa, porque copié ambos directorios localmente y el diff tomó la misma cantidad de tiempo. Tengo una solución para esto: ejecuté ls -1 en ambos directorios y diferencié la salida, pero ¿por qué se tarda tanto en ejecutarse?

aquí está el código; ¿alguna sugerencia?

#!/bin/bash 

before="$(date +%s)" 

diff -r -x '.*' /Volumes/directory1/ /Volumes/directory2/ | sed 's/^.\{24\}//g' > /Volumes/stuff.txt 
diff -r -x '.*' /Volumes/directory3/ /Volumes/directory4/ | sed 's/^.\{24\}//g' > /Volumes/stuff.txt 
diff -r -x '.*' /Volumes/directory5/ /Volumes/directory6/ | sed 's/^.\{24\}//g' > /Volumes/stuff.txt 
diff -r -x '.*' /Volumes/directory7/ /Volumes/directory8/ | sed 's/^.\{24\}//g' > /Volumes/stuff.txt 
diff -r -x '.*' /Volumes/directory9/ /Volumes/directory10/ | sed 's/^.\{24\}//g' > /Volumes/stuff.txt 
diff -r -x '.*' /Volumes/directory11/ /Volumes/directory12/ | sed 's/^.\{24\}//g' > /Volumes/stuff.txt 

after="$(date +%s)" 
elapsed_seconds="$(expr $after - $before)" 
echo Elapsed time for code block: $elapsed_seconds 

Respuesta

11

Cuando los archivos son diferentes diff podrán resolver eso bastante rápidamente. Sin embargo, cuando son iguales, tiene que escanear los archivos en su totalidad para verificar que son, de hecho, byte por byte idénticos.

Si todo lo que importa es las diferencias en los nombres de archivo y no quieren inspeccionar el contenido de los archivos, intente algo como:

diff <(find /Volumes/directory1/ -printf '%P\n') \ 
    <(find /Volumes/directory2/ -printf '%P\n') 

Esto supone que tiene GNU encontró con la acción -printf. Si no lo hace, utiliza un poco de magia subnivel por el comentario de Gordon:

diff <(cd /Volumes/directory1; find .) \ 
    <(cd /Volumes/directory2; find .) 
+2

Si usted no tiene GNU encontrar, esto debería funcionar: 'diff <(. Cd/Volumes/directorio1; encontrar) <(cd/Volumes/directory2; find.) ' –

+0

@gordon gracias, definitivamente está en el camino correcto (ya que estoy en mac os x y no tengo GNU find). ¿Puedes explicar qué está pasando? parece que está encontrando la diferencia de la salida de un hallazgo. en ambos directorios? – rick

+0

gracias, eso tiene sentido ya que siempre encuentra la diferencia desde el principio y luego toma el resto de los 80 minutos para no decir nada. – rick

Cuestiones relacionadas