Menú
Está libre
registro
casa  /  Programas / Comparación de archivos de Linux para desarrolladores web. Comparar archivos de texto en Linux Comparar archivos hexadecimales en Linux

Comparación de archivos de Linux para desarrolladores web. Comparación de archivos de texto en Linux Comparación de archivos hexadecimales en Linux

A veces es necesario comparar varios archivos entre sí. Esto puede ser útil al analizar la diferencia entre varias versiones de un archivo de configuración o simplemente para comparar diferentes archivos. En Linux, existen varias utilidades para esto, tanto para trabajar a través del terminal como en la interfaz gráfica.

En este artículo, veremos cómo se realiza la comparación de archivos de Linux. Echemos un vistazo a los métodos más útiles, tanto para terminal como en modo gráfico. Primero veamos cómo comparar un archivo Linux usando la utilidad diff.

  • Comparación de archivos diff

    La utilidad diff linux es un programa que se ejecuta en modo consola. Su sintaxis es muy sencilla. Llame a la utilidad, pase archivos requeridosy también configure las opciones si es necesario:

    $ diff opciones archivo1 archivo2

    Se pueden transferir más de dos archivos si es necesario. Antes de pasar a los ejemplos, echemos un vistazo a las opciones de utilidad:

    • -q - mostrar solo las diferencias de archivo;
    • -s - mostrar solo las partes coincidentes;
    • -desde - mostrar el número requerido de líneas después de los partidos;
    • -u - mostrar solo el número requerido de líneas después de las diferencias;
    • -y - salida en dos columnas;
    • -mi - salida en formato ed del guión;
    • -norte - salida en formato RCS;
    • -un - comparar archivos como texto, incluso si no son texto;
    • -t - reemplace las pestañas con espacios en la salida;
    • -l - dividir en páginas y agregar soporte de paginación;
    • -r - comparación recursiva de carpetas;
    • -yo - ignorar caso;
    • -MI - ignorar los cambios en las pestañas;
    • -Z - ignorar los espacios al final de la línea;
    • -segundo - ignorar espacios;
    • -SEGUNDO - ignore las líneas vacías.

    Estas fueron las principales opciones de la utilidad, ahora veamos cómo comparar archivos de Linux. En la salida de la utilidad, además de mostrar directamente los cambios, muestra una línea en la que se indica en qué línea y qué se hizo. Para ello, se utilizan los siguientes símbolos:

    • un - adicional;
    • re - eliminado;
    • c - cambiado.

    Además, las líneas que difieran se indicarán con el símbolo<, а те, которые совпадают - символом >.

    Aquí está el contenido de nuestros archivos de prueba:

    Ahora hagamos una comparación de archivos diff:
    $ diff archivo1 archivo2

    Como resultado, obtenemos la línea: 2,3c2,4. Significa que las líneas 2 y 3 se han modificado. Puede usar opciones para ignorar mayúsculas y minúsculas:
    $ diff -i archivo1 archivo2

    Se puede concluir en dos columnas:
    $ diff -y archivo1 archivo2

    Y con la opción -u, puede crear un parche, que luego puede ser aplicado al mismo archivo por otro usuario:
    $ diff -u archivo1 archivo2

    Para procesar varios archivos en una carpeta, es conveniente utilizar la opción -r:
    $ diff -r ~ / tmp1 ~ / tmp2

    Para su comodidad, puede redirigir la salida de la utilidad directamente a un archivo:
    $ diff -u archivo1 archivo2\u003e archivo.patch

    Como ves, todo es muy sencillo. Pero no muy conveniente. Es más agradable utilizar herramientas gráficas.

    Comparando archivos de Linux usando la GUI

    Existen algunas herramientas excelentes para comparar archivos en Linux en una GUI. Puede descubrir fácilmente cómo usarlos. Echemos un vistazo a algunos de ellos:

    1. Kompare

    Kompare es una utilidad gráfica de diferencias que le permite encontrar diferencias en los archivos y combinarlos. Escrito en Qt y diseñado principalmente para KDE. Estas son sus principales características:

  • Soporte para múltiples formatos de diferencias;
  • Admite la comparación de archivos y directorios de Linux;
  • Soporte para ver archivos diff;
  • Interfaz personalizable;
  • Cree y aplique parches a los archivos.

2. DiffMerge

DiffMerge es un software de combinación y comparación de archivos multiplataforma. Le permite comparar dos o tres archivos. Se admite la edición de líneas sobre la marcha.

caracteristicas:

  • Soporte para comparación de directorios;
  • Integración con visor de archivos;
  • Personalizable.

3. Meld

Es una herramienta sencilla para comparar y fusionar archivos. Le permite comparar archivos, directorios y realizar funciones de control de versiones. El programa fue creado para desarrolladores y tiene las siguientes características:

  • Comparación de dos y tres archivos;
  • Usar tipos y palabras personalizados;
  • Modo de fusión automática y acciones con lados de texto;
  • Soporte para Git, Mercurial, Subversion, Bazar y más.

4. Difuso

Diffuse es otra herramienta popular y bastante simple para comparar y fusionar archivos. Está escrito en Python. Se admiten dos funciones principales: comparación de archivos y control de versiones. Puede editar archivos mientras los visualiza. Funciones principales:

  • Resaltado de sintaxis;
  • Atajos de teclado para una fácil navegación;
  • Soporte ilimitado para deshacer;
  • Soporte Unicode;
  • Soporta Git, CVS, Darcs, Mercurial, RCS, Subversion, SVK y Monotone.

5.XXdiff

XXdiff es una herramienta de combinación y comparación de archivos muy potente y gratuita. Pero el programa tiene varios inconvenientes. Esta es la falta de compatibilidad con Unicode y edición de archivos.

caracteristicas:

  • Una comparación superficial o recursiva de uno o dos archivos y directorios;
  • Destacando las diferencias;
  • Asociación interactiva;
  • Soporte para herramientas de comparación externas como GNU Diff, SIG Diff, Cleareddiff y más;
  • Extensibilidad de secuencias de comandos;
  • Personalización.

6.KDiff3

KDiff3 es otra excelente herramienta de comparación de archivos gratuita para el entorno de escritorio KDE. Está incluido en el conjunto de programas KDevelop y funciona en todas las plataformas, incluidas Windows y MacOS. Es posible comparar dos archivos Linux para dos o tres, o incluso comparar directorios. Estas son las características principales:

  • Visualización de las diferencias línea a línea y carácter a carácter;
  • Soporte de fusión automática;
  • Manejo de conflictos de fusión;
  • Soporte Unicode;
  • Mostrando diferencias;
  • Soporte para alineación manual.

), sus comparaciones y comparaciones de clientes GUI para ellos. También ha habido discusiones sobre los complementos IDE para trabajar con git y mercurial. Pero practicamente no habia informacion acerca de la comparación visual y la combinación de herramientas de resolución de conflictos.

Recientemente "salté" de mercurial (que todavía encuentro más conveniente y lógico) a git, porque la gran mayoría de los proyectos en los que estoy interesado usan git y están alojados en github. En este sentido, surgió la cuestión de revisar el arsenal de herramientas, en particular la cuestión selección de herramientas comparación visual y fusión (diferenciación y fusión). Para compensar la falta de información sobre Habré, decidí escribir esta mini-reseña. Como dicen, en persecución.

Debajo del gato también encontrará ejemplos de configuraciones de Git para usar con DiffMerge y WinMerge en Windows. Creo que muchos ahorrarán tiempo.

Nombre caracteristicas: Plataforma

KDiff3

Git y WinMerge

1) Agregar al directorio c: / Git / libexec / git-core / mergetools /
un archivo winmerge con el siguiente contenido:

Diff_cmd () ("c: / Archivos de programa (x86) /WinMerge/WinMergeU.exe" \\ "$ LOCAL" "$ REMOTE"\u003e / dev / null 2\u003e & 1) merge_cmd () ("c: / Archivos de programa (x86) ) /WinMerge/WinMergeU.exe "\\" $ PWD / $ LOCAL "" $ PWD / $ REMOTE "" $ PWD / $ MERGED "\u003e / dev / null 2\u003e & 1 estado \u003d $?)
Cuando Git no puede combinar los cambios automáticamente, se produce un conflicto de combinación y se agregan marcadores de combinación al archivo en conflicto (<<<<<<<, =======, и >\u003e\u003e\u003e\u003e\u003e\u003e). Deben resolver el conflicto utilizando herramientas de terceros.
Considere el archivo readme.txt que se forma como resultado de realizar una fusión de rama maestro y nuevo en el ejemplo anterior:

<<<<<<< HEAD master str ======= new str >\u003e\u003e\u003e\u003e\u003e\u003e nuevo
Podemos abrir el archivo de conflicto usando WinMerge para resolver el conflicto.

Esto abrirá la herramienta de combinación bidireccional:

Basado en la lógica descrita, reescribiremos el comando de fusión merge_cmd de la siguiente manera:
merge_cmd () ("c: / Archivos de programa (x86) /WinMerge/WinMergeU.exe" \\ "$ MERGED"\u003e / dev / null 2\u003e & 1 status \u003d $?)
De hecho, ambas opciones son equivalentes.

2) Editar .gitconfig
tool \u003d winmerge cmd \u003d "winmerge" tool \u003d winmerge cmd \u003d "winmerge" trustSalirCode \u003d false keepBackup \u003d false
la última línea cancela el almacenamiento de archivos de respaldo en el directorio del repositorio.

3) Cree un conflicto al fusionar dos ramas (vea el ejemplo usando DiffMerge).
git difftool master new // compara las dos ramas

Para resolver el conflicto al fusionar ramas, use el comando
git mergetool

Para comparar dos o más archivos, Linux tiene un comando diff. Ella puede comparar como archivos separadosy directorios. Veamos la sintaxis, las opciones del comando diff y algunos ejemplos de uso.

Sintaxis del comando Diff

El comando diff tiene la siguiente sintaxis:

Diferenciar [opciones] archivos o directorios

Especificamos opciones e ingresamos dos o más archivos o directorios que necesitamos comparar.

Opciones del comando Diff

Veamos las opciones principales del comando diff. Solo cubriré las opciones que más utilizo yo mismo.

-MIignore los cambios asociados con la adición de un carácter de tabulación en el texto.
-segundoignore los cambios relacionados con la adición de espacios.
-wignore los cambios relacionados con la adición de espacios y tabulaciones.
-SEGUNDOignore las nuevas líneas en blanco.
-p (o —show-c-function)muestra el nombre de la función en lenguaje C en la que se encontraron los cambios.
-y (o de lado a lado)mostrar los resultados en dos columnas.
-rnavegar por directorios de forma recursiva.
-X ARCHIVOexcluir de la búsqueda los archivos cuyos nombres coincidan con los patrones del archivo FILE.
-d (o -minimal)trate de encontrar la menor cantidad de cambios posible (es decir, elimine los falsos positivos).

Ejemplos de uso del comando diff

Comparación de dos archivos de texto

Para una comparación simple de dos archivos de texto llamados myfile1 y myfile2, ejecute el comando en la terminal:

Diff myfile1 myfile2

Es conveniente redirigir la salida del comando diff a un archivo con la extensión diff. Más editores de texto Linux como Gedit reconocerá este archivo y resaltará su sintaxis. Para enviar el resultado de la comparación al archivo changes.diff, debe usar el símbolo de redirección de flujo (\u003e):

Diff myfile1 myfile2\u003e changes.diff

Comparación de directorios que contienen archivos de texto

Veamos un ejemplo de comparación de dos directorios (mydir1 y mydir2) que contienen archivos de texto... La principal diferencia aquí con el ejemplo anterior es que agregaremos la opción -r para recorrer archivos de forma recursiva en directorios.

Diff -r mydir1 mydir2\u003e changes.diff

Ahora, suponga que hay mucha basura en los directorios donde estamos comparando archivos que no deberíamos comparar. Creemos un archivo excludeFiles y escribamos en él plantillas y nombres de archivos que no deberíamos comparar. Por ejemplo, el contenido de excludeFiles podría verse así:

* .o ChangeLog * * .bak * .exe

Ahora le decimos al comando diff que use nuestros excludeFiles al comparar directorios:

Diff -r -X excludeFiles mydir1 mydir2\u003e changes.diff

Por lo tanto, estamos comparando archivos cuyos nombres no coinciden con los patrones del archivo excludeFiles, por ejemplo, vasya.exe o ChangeLog12.

Agreguemos algunas opciones más, que se describen anteriormente, para mejorar el resultado de la comparación:

Diff -rwBd -X excludeFiles mydir1 mydir2\u003e changes.diff

Comparamos archivos en los directorios mydir1 y mydir2, ignorando los cambios relacionados con la adición de líneas en blanco, espacios, tabulaciones y también usamos patrones de nombre de archivo en excludeFiles para excluir archivos innecesarios de la comparación.

Conclusión

Para obtener más información sobre el uso del comando diff en su sistema Linux puede obtenerlo ejecutando el comando:

Hombre diff

También hay programas que le permiten comparar archivos usando interfaz grafica... Por ejemplo, el programa Meld, que muestra claramente dónde y qué ha cambiado en los archivos.



Comparando dos archivos en la terminal linux (6)

Aquí está mi solución para esto:

Mkdir temp mkdir resultados cp / usr / share / dict / american-english ~ / temp / american-english-dictionary cp / usr / share / dict / british-english ~ / temp / british-english-dictionary cat ~ / temp / american -inglés-diccionario | wc -l\u003e ~ / results / count-american-english-dictionary cat ~ / temp / british-english-dictionary | wc -l\u003e ~ / results / count-british-english-dictionary grep -Fxf ~ / temp / american-english-dictionary ~ / temp / british-english-dictionary\u003e ~ / results / common-english grep -Fxvf ~ / results / common-english ~ / temp / american-english-dictionary\u003e ~ / results / unique-american-english grep -Fxvf ~ / results / common-english ~ / temp / british-english-dictionary\u003e ~ / results / unique-british -Inglés

Hay dos archivos llamados "A.txt" y "B.txt", y que es una lista de palabras. Ahora quiero comprobar qué palabras se agregan a "A.txt" y no estan en "B.txt" .

Necesito un algoritmo eficiente ya que necesito comparar dos diccionarios.

Puede usar la herramienta linux diff para comparar dos archivos. Para filtrar los datos requeridos, puede usar opciones: formato de grupo modificado y --formato-de-grupo-sin-cambios .

Las siguientes tres opciones se pueden utilizar para seleccionar el grupo apropiado para cada opción:

    "% <" получить строки из FILE1

    "%\u003e" obtiene líneas de FILE2

    "" (línea vacía) para eliminar líneas de ambos archivos.

Por ejemplo: diff --changed-group-format \u003d "%<" --unchanged-group-format = "" file1.txt file2.txt

[tmp] # cat file1.txt prueba una prueba dos prueba tres prueba cuatro prueba ocho [tmp] # cat file2.txt prueba una prueba tres prueba nueve [tmp] # diff --changed-group-format \u003d "%<" --unchanged-group-format="" file1.txt file2.txt test two test four test eight

Si prefiere el estilo de salida diff de git diff, puede usarlo con la marca --no-index para comparar archivos fuera del repositorio de git:

Git diff --no-index a.txt b.txt

Usando un par de archivos con 200K cadenas de nombre de archivo cada uno, comparé (con el comando de tiempo incorporado) este enfoque y algunas otras respuestas aquí:

Git diff --no-index a.txt b.txt # ~ 1.2s comm -23<(sort a.txt) <(sort b.txt) # ~0.2s diff a.txt b.txt # ~2.6s sdiff a.txt b.txt # ~2.7s vimdiff a.txt b.txt # ~3.2s

comm parece ser el más rápido con diferencia, mientras que git diff --no-index parece ser el enfoque más rápido para la salida de estilo diff.

Actualización 2018-03-25 De hecho puede omitir la marca --no-index si no se encuentra en un repositorio de git y desea comparar los archivos no reproducibles en ese repositorio. De las páginas del manual:

Este formulario es para comparar los datos de dos rutas en el sistema de archivos. Puede omitir el parámetro -no-index cuando ejecute un comando en un árbol de trabajo controlado por Git y al menos uno de los puntos de referencia fuera del árbol de trabajo, o cuando ejecute un comando fuera de un árbol de trabajo controlado por Git.

Utilice comm -13 (se requieren archivos ordenados) :

$ archivo cat1 uno dos tres $ archivo cat2 uno dos tres cuatro $ comm -13<(sort file1) <(sort file2) four

Ordénelos y use comm:

Comm -23<(sort a.txt) <(sort b.txt)

comm compara (ordena) los archivos de entrada e imprime tres columnas de forma predeterminada: cadenas que son exclusivas de a, cadenas que son exclusivas de b y cadenas que están presentes en ambos. Si especifica -1, -2 y / o -3, puede suprimir la salida correspondiente. Por lo tanto, comm -23 ab solo enumera las entradas que son exclusivas de a. Estoy usando la sintaxis<(...) для сортировки файлов на лету, если они уже отсортированы, вам это не нужно.

si tiene vim instalado, intente esto:

Archivo Vimdiff1 archivo2

Vim -d archivo1 archivo2

lo encontrará fantástico.

), sus comparaciones y comparaciones de clientes GUI para ellos. También ha habido discusiones sobre los complementos IDE para trabajar con git y mercurial. Pero practicamente no habia informacion acerca de la comparación visual y la combinación de herramientas de resolución de conflictos.

Recientemente "salté" de mercurial (que todavía encuentro más conveniente y lógico) a git, porque la gran mayoría de los proyectos en los que estoy interesado usan git y están alojados en github. En este sentido, surgió la cuestión de revisar el arsenal de herramientas, en particular la cuestión selección de herramientas comparación visual y fusión (diferenciación y fusión). Para compensar la falta de información sobre Habré, decidí escribir esta mini-reseña. Como dicen, en persecución.

Debajo del gato también encontrará ejemplos de configuraciones de Git para usar con DiffMerge y WinMerge en Windows. Creo que muchos ahorrarán tiempo.

Nombre caracteristicas: Plataforma

KDiff3

Git y WinMerge

1) Agregar al directorio c: / Git / libexec / git-core / mergetools /
un archivo winmerge con el siguiente contenido:

Diff_cmd () ("c: / Archivos de programa (x86) /WinMerge/WinMergeU.exe" \\ "$ LOCAL" "$ REMOTE"\u003e / dev / null 2\u003e & 1) merge_cmd () ("c: / Archivos de programa (x86) ) /WinMerge/WinMergeU.exe "\\" $ PWD / $ LOCAL "" $ PWD / $ REMOTE "" $ PWD / $ MERGED "\u003e / dev / null 2\u003e & 1 estado \u003d $?)
Cuando Git no puede combinar los cambios automáticamente, se produce un conflicto de combinación y se agregan marcadores de combinación al archivo en conflicto (<<<<<<<, =======, и >\u003e\u003e\u003e\u003e\u003e\u003e). Deben resolver el conflicto utilizando herramientas de terceros.
Considere el archivo readme.txt que se forma como resultado de realizar una fusión de rama maestro y nuevo en el ejemplo anterior:

<<<<<<< HEAD master str ======= new str >\u003e\u003e\u003e\u003e\u003e\u003e nuevo
Podemos abrir el archivo de conflicto usando WinMerge para resolver el conflicto.

Esto abrirá la herramienta de combinación bidireccional:

Basado en la lógica descrita, reescribiremos el comando de fusión merge_cmd de la siguiente manera:
merge_cmd () ("c: / Archivos de programa (x86) /WinMerge/WinMergeU.exe" \\ "$ MERGED"\u003e / dev / null 2\u003e & 1 status \u003d $?)
De hecho, ambas opciones son equivalentes.

2) Editar .gitconfig
tool \u003d winmerge cmd \u003d "winmerge" tool \u003d winmerge cmd \u003d "winmerge" trustSalirCode \u003d false keepBackup \u003d false
la última línea cancela el almacenamiento de archivos de respaldo en el directorio del repositorio.

3) Cree un conflicto al fusionar dos ramas (vea el ejemplo usando DiffMerge).
git difftool master new // compara las dos ramas

Para resolver el conflicto al fusionar ramas, use el comando
git mergetool