L'utilità DIFF funziona per 2 file. Come confrontare più di 2 file alla volta?


86

Quindi l'utility Diff funziona proprio come voglio per 2 file, ma ho un progetto che richiede confronti con più di 2 file alla volta, forse fino a 10 alla volta. Ciò richiede anche avere tutti quei file uno accanto all'altro. La mia ricerca non ha portato a nulla, vimdiff sembra essere il migliore finora con la possibilità di confrontare 4 alla volta.

La mia domanda: esiste un'utilità per confrontare più di 2 file alla volta o un modo per hackerare diff / vimdiff in modo che possa fare confronti multipli? I file che confronterò sono relativamente brevi, quindi non dovrebbe essere troppo lento.

Grazie in anticipo!

Risposte:


111

La visualizzazione di 10 file fianco a fianco e l'evidenziazione delle differenze possono essere facilmente eseguite con Diffuse . Specifica semplicemente tutti i file sulla riga di comando in questo modo:

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


1
Wow, è fantastico! Grazie per la risposta anche in ritardo, avevo ancora bisogno dell'aiuto.
— Javed Ahamed

1
Come si chiama questo tipo di confronto?
— leeand00

4
Strumento fantastico; mi ha appena aiutato a risolvere un problema fastidioso. So che è una risposta più vecchia, ma grazie!
— SeanKilleen

Grazie mille volte! Ha aiutato molto a scoprire piccole differenze in un mucchio di file incollati.
— Trass3r

1
@Gruber - Devo premere il link in un brutto momento - Ho rimosso il mio commento
— combatc2

30

Vim può già farlo:

vim -d file1 file2 file3

Ma normalmente sei limitato a 4 file. Puoi cambiarlo modificando una singola riga nel sorgente di Vim, tuttavia. La costante DB_COUNTdefinisce il numero massimo di file diff ed è definita verso l' diff.cinizio delle versioni 6.xe precedenti, o circa due terzi rispetto alle structs.hversioni 7.0 e successive.


vimdiff o vim -d possono fare solo 4 file alla volta almeno sul mio computer. qualcuno sa come aggirare questo?
— Javed Ahamed

Non ho notato la menzione di questo nella domanda. Aggiornato per includere istruzioni su come modificare il limite di Vim.
— Noah Medling

Ehi, sai come arrivare effettivamente a structs.h o diff.c? Non riesco a trovare il codice sorgente di vim su Win o Linux.
— Javed Ahamed

vim non sembra essere in grado di fare confronti di directory per più di due directory, il che limita l'utilità. Un'ulteriore limitazione è che quando i file vengono confrontati tra loro puoi vedere solo il lato sinistro del file, non ci sono barre di scorrimento per vedere tutto. E non esiste un metodo GUI per spingere avanti e indietro le modifiche.
— Jereme Guenther

7

diffha l'opzione incorporata --from-filee --to-file, che confronta un operando con tutti gli altri.

   --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.

Vorrei poterlo far funzionare con la sostituzione del processo invece dei percorsi di file reali.
— Jan Kyu Peblik

1
@JanKyuPeblik Se usi zsh, controlla la forma = (...) di sostituzione del processo che scrive l'output in un file temporaneo e si espande al nome di quel file temporaneo zsh.sourceforge.net/Doc/Release/…
— Eric Freese

2

Checkout "Beyond Compare": http://www.scootersoftware.com/

Ti consente di confrontare intere directory di file e sembra che funzioni anche su Linux.


1
diff -r confronta anche intere directory di file, ma confronta solo i file di una directory con i file dell'altra directory
— reinierpost

6
Beyond Compare è uno strumento magnifico e lo uso sempre per risolvere i conflitti di unione. Tuttavia non è lo strumento giusto per questo lavoro, in quanto può confrontare solo due file l'uno con l'altro o con un antenato comune.
— Superole

Ci scusiamo per -1, ma si tratta di confrontare molti file tra loro.
— Manohar Reddy Poreddy

1

se stai eseguendo più differenze basate su un file, potresti probabilmente provare a scrivere uno script che abbia un ciclo for per eseguire attraverso ogni directory ed eseguire il diff. Anche se non sarebbero fianco a fianco potresti almeno confrontarli rapidamente. spero che abbia aiutato.


sì, ma se stavo confrontando ad esempio 3 file, vorrei che fossero tutti diff contro ciascuno degli altri 2 file, poiché diff lo riorganizza per vedere dove corrispondono.
— Javed Ahamed

Ho trovato questo comando che potrebbe aiutare con il tuo script, si chiama diff3 e presumibilmente è un'utilità per confrontare tre file. linux.about.com/library/cmd/blcmdl1_diff3.htm la versione per Windows può essere trovata qui gnuwin32.sourceforge.net/packages/diffutils.htm
— Benjamin Neil

0

Non rispondendo alla domanda principale, ma ecco qualcosa di simile a quello che Benjamin Neil ha suggerito ma differisce da tutti i file:

Memorizza i nomi dei file in un array, quindi ripeti le combinazioni di dimensione due e diff (o fai quello che vuoi).

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

Derivato dalla risposta di @ charles-duffy : https://stackoverflow.com/a/46719215/1160428


0

C'è un modo semplice e buono per farlo = GREP.

A seconda della dimensione del testo puoi copiarlo e incollarlo, oppure puoi reindirizzare l'input del file al comando grep. Se crei un percorso grep -vir / per eseguire una ricerca inversa o un percorso grep -ir /. Questa è la mia strada per gli esami di certificazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.