La utilidad DIFF funciona para 2 archivos. ¿Cómo comparar más de 2 archivos a la vez?


84

Entonces, la utilidad Diff funciona como yo quiero para 2 archivos, pero tengo un proyecto que requiere comparaciones con más de 2 archivos a la vez, tal vez hasta 10 a la vez. Esto también requiere tener todos esos archivos uno al lado del otro. Mi investigación realmente no ha arrojado nada, vimdiff parece ser el mejor hasta ahora con la capacidad de comparar 4 a la vez.

Mi pregunta: ¿Existe alguna utilidad para comparar más de 2 archivos a la vez, o alguna forma de hackear diff / vimdiff para que pueda hacer múltiples comparaciones? Los archivos que compararé son relativamente cortos, por lo que no debería ser demasiado lento.

¡Gracias por adelantado!

Respuestas:


111

Con Diffuse se pueden mostrar 10 archivos uno al lado del otro y resaltar las diferencias . Simplemente especifique todos los archivos en la línea de comando de esta manera:

difuso 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt 10.txt


1
¡Vaya, esto es asombroso! Gracias por la respuesta incluso tarde, todavía necesitaba la ayuda.
Javed Ahamed

1
¿Cómo se llama este tipo de comparación?
leeand00

4
Herramienta fantástica; me ayudó a resolver un problema molesto. Sé que es una respuesta anterior, ¡pero gracias!
SeanKilleen

¡Mil gracias! Ayudó mucho a descubrir pequeñas diferencias en un montón de archivos copiados y pegados.
Trass3r

1
@Gruber - Debo presionar el enlace en un mal momento
Eliminé

28

Vim ya puede hacer esto:

vim -d file1 file2 file3

Pero normalmente está limitado a 4 archivos. Sin embargo, puede cambiar eso modificando una sola línea en la fuente de Vim. La constante DB_COUNTdefine el número máximo de diff archivos ed, y está definida hacia la parte superior diff.cen las versiones 6.xy anteriores, o alrededor de dos tercios del camino hacia abajo structs.hen las versiones 7.0 en adelante.


vimdiff o vim -d solo pueden hacer 4 archivos a la vez al menos en mi computadora. ¿Alguien sabe cómo evitar esto?
Javed Ahamed

No noté la mención de eso en la pregunta. Actualizado para incluir instrucciones sobre cómo cambiar el límite de Vim.
Noah Medling

Oye, ¿sabes cómo llegar realmente a structs.ho diff.c? No puedo encontrar el código fuente de vim en Win o Linux.
Javed Ahamed

vim no parece ser capaz de realizar comparaciones de directorios para más de dos directorios, lo que limita la utilidad. Una limitación adicional es que cuando los archivos se comparan entre sí, solo puede ver el lado izquierdo del archivo, no hay barras de desplazamiento para ver todo. Y no existe un método de GUI para impulsar cambios hacia adelante y hacia atrás.
Jereme Guenther

7

difftiene la opción incorporada --from-filey --to-file, que compara un operando con todos los demás.

   --from-file=FILE1
          Compare FILE1 to all operands.  FILE1 can be a directory.

   --to-file=FILE2
          Compare all operands to FILE2.  FILE2 can be a directory.

Ojalá pudiera hacer que esto funcione con la sustitución de procesos en lugar de rutas de archivo reales.
Jan Kyu Peblik

1
@JanKyuPeblik Si usa zsh, consulte la forma = (...) de sustitución de proceso que escribe la salida en un archivo temporal y se expande al nombre de ese archivo temporal zsh.sourceforge.net/Doc/Release/…
Eric Freese

2

Realice la compra "Más allá de la comparación": http://www.scootersoftware.com/

Le permite comparar directorios completos de archivos y parece que también se ejecuta en Linux.


1
diff -r también compara directorios completos de archivos, pero solo compara los archivos de un directorio con los archivos del otro directorio
reinierpost

6
Beyond Compare es una herramienta magnífica y la uso todo el tiempo para resolver conflictos de fusión. Sin embargo, no es la herramienta adecuada para este trabajo, ya que solo puede comparar dos archivos entre sí o con un antepasado común.
Superole

Lo siento por -1, pero se trata de comparar muchos archivos entre sí.
Manohar Reddy Poreddy

1

si está ejecutando múltiples diferencias basadas en un archivo, probablemente podría intentar escribir un script que tenga un bucle for para ejecutar a través de cada directorio y ejecutar la diferencia. Aunque no sería uno al lado del otro, al menos podría compararlos rápidamente. Espero que haya ayudado.


sí, pero si estuviera comparando, por ejemplo, 3 archivos, me gustaría que todos difieran con cada uno de los otros 2 archivos, ya que diff hace esa reorganización para ver dónde coinciden.
Javed Ahamed

Encontré este comando que podría ayudar con su script, se llama diff3 y supuestamente es una utilidad para comparar tres archivos. linux.about.com/library/cmd/blcmdl1_diff3.htm la versión de Windows se puede encontrar aquí gnuwin32.sourceforge.net/packages/diffutils.htm
Benjamin Neil

0

No respondemos a la pregunta principal, pero aquí hay algo similar a lo que sugirió Benjamin Neil, pero diferenciando todos los archivos:

Almacene los nombres de archivo en una matriz, luego recorra las combinaciones de tamaño dos y diff (o haga lo que quiera).

files=($(ls -d /path/of/files/some-prefix.*))     # Array of files to compare
max=${#files[@]}                                  # Take the length of that array
for ((idxA=0; idxA<max; idxA++)); do              # iterate idxA from 0 to length
  for ((idxB=idxA + 1; idxB<max; idxB++)); do     # iterate idxB + 1 from idxA to length
    echo "A: ${files[$idxA]}; B: ${files[$idxB]}" # Do whatever you're here for.
  done
done

Derivado de la respuesta de @ charles-duffy : https://stackoverflow.com/a/46719215/1160428


0

Hay una buena forma sencilla de hacer esto = GREP.

Dependiendo del tamaño del texto, puede copiarlo y pegarlo, o puede redirigir la entrada del archivo al comando grep. Si crea un grep -vir / path para realizar una búsqueda inversa o un grep -ir / path. Esta es mi forma de hacer los exámenes de certificación.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.