Qual è l'equivalente di Windows del comando diff?


284

So che esiste un post simile a questo: qui .
Ho provato a usare il compcomando come indicato, ma se ho due file, uno con dati come "abcd" e l'altro con dati "abcde", si dice solo che i file sono di dimensioni diverse. Volevo sapere dove differiscono esattamente. In Unix, il semplice diff mi dice quale riga e colonna, il comando comp in windows funziona se ho qualcosa come "abd" e "abc". Non altrimenti. Qualche idea su cosa posso usare per questo?

Risposte:


461

Esegui questo nella shell CMD o nel file batch:

FC file1 file2

FC può anche essere usato per confrontare i file binari:

FC /B file1 file2

3
Come si fa con tutti i file modificati in due cartelle? Ad esempio, confronto i contenuti di folder1 con i contenuti di folder2: vengono visualizzate le righe modificate in folder2?
Wolfpack'08,

17
@ Wolfpack'08 ": FC path1\* FC path2\*confronterebbe tutti i file nelle cartelle path1e path2, a condizione che (i file) abbiano nomi identici. Se ci sono file con nomi non corrispondenti, FC segnalerebbe un file mancante, ma solo per i file della prima cartella che non sono trovato nella seconda cartella e non viceversa. Per rilevare tutte le discrepanze, probabilmente sarebbe necessaria una tecnica diversa.
Andriy M

@AndriyM Quindi, i nuovi file causerebbero errori di FC senza restituire alcuna riga effettiva? Solo il messaggio di errore?
Wolfpack'08,

1
@ Wolfpack'08: Sì, solo il messaggio sulla controparte mancante, nessuna riga dalla parte esistente. (Ma questo non finirebbe l'elaborazione di altre coppie di file esistenti e il loro confronto verrebbe comunque effettuato, se è quello che stavi chiedendo.)
Andriy M

@AndriyM Quindi, vuoi dire: "Se l'errore: files in both directories are diff'd; files in only one directory throw errors." Interessante. Ma sicuramente c'è un programma di terze parti equivalente a diff?
Wolfpack'08,

36

Bene, su Windows corro felicemente diffe molti altri strumenti GNU. Puoi farlo con Cygwin , ma personalmente preferisco GnuWin32 perché è un'esperienza di installazione molto più leggera.

Quindi, la mia risposta è che l'equivalente di Windows di diff, non è altro che diffse stesso!


1
L'installazione di base di Cygwin non sembra includere diff. Quali pacchetti aggiuntivi devo installare per ottenerlo?
Warren Dew,

7
Non consiglio Cygwin. Userei un nativo Win32 port di diff
David Heffernan il

1
@WarrenDew Il pacchetto Cygwin che ti serve è diffutils. Vedi cygwin.com/cgi-bin2/…
Steve Pitchers,

24

Winmerge ha un'utilità da riga di comando che potrebbe valere la pena di provare .

Inoltre, puoi usare anche la parte grafica di esso a seconda di ciò di cui hai bisogno.


2
Anche se questa non è un'utilità di Windows integrata, la consiglio vivamente: è open source, leggera e nella mia esperienza priva di bug.
david.barkhuizen,

19

Un'altra alternativa è scaricare e installare git da qui . Quindi, aggiungi il percorso Git\bin\alla tua PATHvariabile. Questo ti darà non solo diff, ma anche molti altri comandi Linux che puoi usare dalla riga di comando di Windows.

È possibile impostare la PATHvariabile facendo clic con il tasto destro su Computer e selezionando Proprietà. Quindi è possibile fare clic su Impostazioni di sistema avanzate sul lato sinistro dello schermo. Nel pop-up, fai clic su Variabili d'ambiente e quindi aggiungi o aggiorna la variabile PATH nelle variabili utente conGit\bin\

Documentazione Git diff


@firelight - grazie per la risposta. Puoi elaborare cosa intendi qui: "Quindi, aggiungi il percorso a Git \ bin \ alla tua variabile PATH."
BKSpurgeon,

2
@BKSpurgeon - Se si fa clic con il tasto destro su Computer e si seleziona Proprietà, è possibile fare clic su Impostazioni di sistema avanzate sul lato sinistro dello schermo. Nel pop-up, fai clic su Variabili d'ambiente e quindi aggiungi o aggiorna la variabile PATH nelle variabili utente con Git \ bin \
Tim Hutchison,

@JustinCormack Hai delle referenze per questo? Ho appena provato a diffondere in Git Bash e ha funzionato
Tim Hutchison

3
@Tim Hutchison, dalla tua risposta: "Questo ti darà non solo diff, ma anche molti altri comandi di Linux che puoi usare dalla riga di comando di Windows." - quali intendi? Quando si installa Git, dovrebbe avere solo gli git...eseguibili disponibili dal PERCORSO. Inoltre, la risposta dovrebbe probabilmente includere un'informazione importante: che è necessario avviare lo strumento diff scrivendo git diff, non solo diff.
Petr Bodnár,

amico, questo è totalmente un altrodiff
vintproykt il

14

Nel mio caso l'FC funziona alla grande, ma non è stato utile perché volevo solo cambiare le righe. E FC fornisce dati aggiuntivi come nome del file, stesse righe e confronto bilaterale.

    >fc data.txt data.txt.bak   
    ***** DATA.TXT
    ####09
    ####09
    ####09
    ***** DATA.TXT.BAK
    ####09
    ####08
    ####09

ma nel mio caso volevo solo le righe che sono cambiate e volevo che quelle righe fossero esportate in file diversi, senza altre intestazioni o dati.

Quindi ho usato "findstr" per confrontare il file:

findstr /V /G:data.txt.bak data.txt >DiffResult.txt

dove :

data.txt.bak è il nome del vecchio file

data.txt è il nome del nuovo file

DiffResult.txt contiene i dati che sono stati modificati, ad esempio solo una riga #### 09


1
/ Una sola prima riga e l'ultima riga del blocco che viene cambiata / N mostra i numeri di riga
Lukas

10

fc. fc è migliore nella gestione di file di grandi dimensioni (> 4 GByte) rispetto alla diff di Cygwin.


10

C'è anche Powershell (che fa parte di Windows). Non è veloce ma è flessibile, ecco il comando di base. Le persone hanno scritto vari cmdlet e script per questo se hai bisogno di una migliore formattazione.

PS C:\Users\Troll> Compare-Object (gc $file1) (gc $file2)

Non fa parte di Windows, ma se sei uno sviluppatore con Visual Studio, viene fornito con WinDiff (grafico)

Ma il mio preferito è BeyondCompare, che costa $ 30.


4

DiffUtils è probabilmente la soluzione migliore. È l'equivalente di Windows di diff.

Per quanto ne sappia, non esistono equivalenti incorporati.


Ho usato anche questo, tuttavia, oggi ho scoperto che la versione piuttosto vecchia 2.8.7 fornita in quella pagina ha un bug (quando si confrontano alcuni file PDF vengono riportati come uguali). Quindi ora preferisco il "git diff" come suggerito dalla luce del fuoco.
anre,

4

Il motivo per cui si ottiene l'errore con COMP è che l'utilità presuppone che i file che si stanno confrontando abbiano le stesse dimensioni. Per ovviare a questo è possibile utilizzare l' '/n'opzione con la quale è possibile specificare il numero di righe che si desidera confrontare. (vedi le opzioni supportate da comp digitando 'comp /?'sulla riga di comando. così il tuo comando sarebbe simile a:

C:\>comp "filepath1" "filepath2" /a /l /n=(the number of lines you want to compare) /c 

Questo dovrebbe risolvere il tuo problema se vuoi continuare ad usare COMP. Ma questo sarà un problema per file molto grandi.

Anche se compè un'opzione, ma penso che sia primitiva ed FCè un'opzione migliore. puoi usarlo FORFILESe FCinsieme per creare probabilmente un'utilità davvero buona per filecompare se ne hai bisogno su una base frequente.

FC viene utilizzato in questo modo per ref:

C:\>fc /c(case insensistive) /lbn(number of errors allowed before you wanna stop compare) /n(display line number) "filename1" "filename2"

ci sono molte opzioni disponibili che puoi vedere 'fc /?' sperando che questo aiuti




0

Non so se il seguente strumento sia esattamente ciò di cui hai bisogno. Ma mi piace usare, per file specifici, alcuni strumenti online. In questo modo posso usarlo indipendentemente dal sistema operativo. Ecco un esempio: diffchecker.com

Ma per le mie esigenze, immagino che lo strumento migliore per tenere traccia delle modifiche e dei registri dei file del mio progetto sia GIT. Se lavori in gruppo, puoi avere dei repository online in un tuo server o utilizzarlo con Bitbucket o Github.

Spero che aiuti qualcuno.


0

Se hai installato git sul tuo computer, puoi aprire un terminale git e usare il diffcomando Linux normalmente.

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.