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 archivo2Como 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 archivo2Se puede concluir en dos columnas:
$ diff -y archivo1 archivo2Y con la opción -u, puede crear un parche, que luego puede ser aplicado al mismo archivo por otro usuario:
$ diff -u archivo1 archivo2Para procesar varios archivos en una carpeta, es conveniente utilizar la opción -r:
$ diff -r ~ / tmp1 ~ / tmp2Para su comodidad, puede redirigir la salida de la utilidad directamente a un archivo:
$ diff -u archivo1 archivo2\u003e archivo.patchComo 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 |
KDiff3Git y WinMerge1) 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 $?) <<<<<<< HEAD
master str
=======
new str
>\u003e\u003e\u003e\u003e\u003e\u003e nuevo 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: 2) Editar .gitconfig 3) Cree un conflicto al fusionar dos ramas (vea el ejemplo usando DiffMerge). Para resolver el conflicto al fusionar ramas, use el comando |
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.
-MI | ignore los cambios asociados con la adición de un carácter de tabulación en el texto. |
-segundo | ignore los cambios relacionados con la adición de espacios. |
-w | ignore los cambios relacionados con la adición de espacios y tabulaciones. |
-SEGUNDO | ignore 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. |
-r | navegar por directorios de forma recursiva. |
-X ARCHIVO | excluir 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.
[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 eightPor ejemplo: diff --changed-group-format \u003d "%<" --unchanged-group-format = "" file1.txt file2.txt
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 |
KDiff3Git y WinMerge1) 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 $?) <<<<<<< HEAD
master str
=======
new str
>\u003e\u003e\u003e\u003e\u003e\u003e nuevo 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: 2) Editar .gitconfig 3) Cree un conflicto al fusionar dos ramas (vea el ejemplo usando DiffMerge). Para resolver el conflicto al fusionar ramas, use el comando |