Cómo diferenciar archivos grandes en Linux

31

Recibo un diff: memory exhaustederror al intentar diferenciar dos archivos de 27 GB que son muy similares en una caja Linux con CentOS 5 y 4 GB de RAM. Este es un problema conocido, parece.

Esperaría que hubiera una alternativa para una utilidad tan esencial, pero no puedo encontrarla. Me imagino que la solución tendría que usar archivos temporales en lugar de memoria para almacenar la información que necesita.

  • Traté de usar rdiffy xdelta, pero son mejores para mostrar los cambios entre dos archivos, como un parche, y no son tan útiles para inspeccionar las diferencias entre dos archivos.
  • Intentado VBinDiff , pero es una herramienta visual que es mejor para comparar archivos binarios. Necesito algo que pueda canalizar las diferencias a STDOUT como de costumbre diff.
  • Hay muchas otras utilidades como vimdiffque solo funcionan con archivos más pequeños.
  • También leí sobre Solaris bdiffpero no pude encontrar un puerto para Linux.

¿Alguna idea además de dividir el archivo en piezas más pequeñas? Tengo 40 de estos archivos, así que trato de evitar el trabajo de dividirlos.

Tumba
fuente
¿Qué versión de xdelta probaste? xdelta3 o xdelta1?
nmuntz
Era la versión 1.1.4. ¿Xdelta3 proporciona una funcionalidad diferente? Acabo de revisar el documento en línea y todavía parece que se trata de proporcionar "deltas".
Tom B
Consulte también esta respuesta: unix.stackexchange.com/a/77259/27186
unhammer el

Respuestas:

12

cmphace las cosas byte a byte, por lo que probablemente no se quede sin memoria (solo lo probé en dos archivos de 7 GB), pero es posible que esté buscando más detalles que una lista de "archivos X e Y que difieren en byte x , línea y ". Si las similitudes de sus archivos están desplazadas (p. Ej., El archivo Y tiene un bloque de texto idéntico, pero no en la misma ubicación), puede pasar compensaciones a cmp; probablemente podría convertirlo en una comparación de resincronización con un script pequeño.

Aparte: en caso de que alguien más aterrice aquí cuando busque una manera de confirmar que dos estructuras de directorio (que contienen archivos muy grandes) son idénticas: diff --recursive --brief(o diff -r -qpara abreviar, o tal vez incluso diff -rq) funcionarán y no se quedarán sin memoria.

Felix
fuente
bueno, creo que -q es la clave aquí, de alguna manera no tenerlo puede requerir diff para poner todo el archivo (o al menos líneas completas) en la memoria ...
rogerdpack
7

Encontré este enlace

diff -H podría ayudar, o puede intentar instalar el puerto textproc / 2bsd-diff que aparentemente no intenta cargar los archivos en la RAM, por lo que puede funcionar en archivos grandes más fácilmente.

No estoy seguro si probaste esas dos opciones o si podrían funcionar para ti. Buena suerte.

Jarvin
fuente
1
¿Ayuda esto a alguien por ahí? Para mí, el mismo fracaso ...
rogerdpack
12
Para cualquiera que se pregunte: diff -Hes un alias indocumentado y en desuso para diff --speed-large-files.
a3nm
1
Esta respuesta no ayuda. Esta es una pregunta de Linux, y para instalar 2bsd-diff, primero debe portarlo. Después de encontrar una fuente . Y lo parcheé . Posible, pero poco probable, una solución viable.
nyov
1

Si los archivos son idénticos (la misma longitud) excepto por unos pocos valores de bytes, puede usar un script como el siguiente ( wes el número de bytes por línea a hexdump, ajústelo al ancho de su pantalla):

w=12;
while read -ru7 x && read -ru8 y;
do
  [ ".$x" = ".$y" ] || echo "$x | $y";
done 7< <(od -vw$w -tx1z FILE1) 8< <(od -vw$w -tx1z FILE2) > DIFF-FILE1-FILE2 &

less DIFF-FILE1-FILE2

No es muy rápido, pero hace el trabajo.

Tino
fuente