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.