Qual é o equivalente do Windows ao comando diff?


284

Eu sei que existe um post semelhante a este: aqui .
Eu tentei usar o compcomando como mencionado, mas se eu tiver dois arquivos, um com dados como "abcd" e outro com dados "abcde", apenas diz que os arquivos são de tamanhos diferentes. Eu queria saber onde exatamente eles diferem. No Unix, o diff simples me diz qual linha e coluna, o comando comp no Windows funciona se eu tiver algo como "abd" e "abc". Não de outra forma. Alguma idéia do que eu possa usar para isso?

Respostas:


461

Execute isso no arquivo CMD do shell ou lote:

FC file1 file2

FC também pode ser usado para comparar arquivos binários:

FC /B file1 file2

3
Como você faz isso com todos os arquivos alterados em duas pastas? Como, comparo o conteúdo da pasta1 com o conteúdo da pasta2: alguma linha alterada na pasta2 aparece?
precisa saber é o seguinte

17
@ Wolfpack'08 ": FC path1\* FC path2\*compararia todos os arquivos nas pastas path1e path2, desde que (os arquivos) tivessem nomes idênticos. Se houver arquivos com nomes incompatíveis, o FC reportará um arquivo ausente, mas apenas para os arquivos da primeira pasta que não estão disponíveis. . 't encontrado na segunda pasta e não o contrário para pegar todos os desencontros, provavelmente seria necessária uma técnica diferente.
Andriy M

@AndriyM Então, novos arquivos causariam erros no FC sem retornar nenhuma linha real? Apenas a mensagem de erro?
Wolfpack'08

1
@ Wolfpack'08: Sim, apenas a mensagem sobre a contraparte desaparecida, sem linhas da parte existente. (Mas isso não iria encerrar o processamento de outra, já existente, pares de arquivos e sua comparação ainda seria realizado, se é isso que você estava perguntando.)
Andriy M

@AndriyM Então, você quer dizer: "Se erro: files in both directories are diff'd; files in only one directory throw errors." Interessante. Mas certamente há um programa de terceiros equivalente ao diff?
precisa

36

Bem, no Windows, eu corro feliz diffe muitas outras ferramentas GNU. Você pode fazer isso com o cygwin , mas eu pessoalmente prefiro o GnuWin32 porque é uma experiência de instalação muito mais leve.

Portanto, minha resposta é que o equivalente do Windows diffnão é outro senão diffele mesmo!


1
A instalação base do Cygwin não parece incluir diff. Quais pacotes adicionais eu preciso instalar para obtê-lo?
Warren orvalho

7
Eu não recomendo o cygwin. Eu usaria uma porta Win32 nativo de diff
David Heffernan

1
@WarrenDew O pacote Cygwin que você precisa é diffutils. Veja cygwin.com/cgi-bin2/…
Steve Pitchers

24

O Winmerge possui um utilitário de linha de comando que pode valer a pena conferir.

Além disso, você também pode usar a parte gráfica, dependendo do que você precisa.


2
Embora esse não seja um utilitário interno do Windows, eu o recomendo - ele é de código aberto, leve e, na minha experiência, livre de erros.
David.barkhuizen

19

Outra alternativa é baixar e instalar o git a partir daqui . Em seguida, adicione o caminho Git\bin\para sua PATHvariável. Isso fornecerá não apenas diff, mas também muitos outros comandos linux que você pode usar na linha de comando do Windows.

Você pode definir a PATHvariável clicando com o botão direito do mouse em Computador e selecionando Propriedades. Depois, você pode clicar em Configurações avançadas do sistema, no lado esquerdo da tela. No pop-up, clique em Variáveis ​​de ambiente e adicione ou atualize a variável PATH nas suas variáveis ​​de usuário comGit\bin\

Documentação do diff do Git


@firelight - obrigado por sua resposta. Você pode elaborar o que você quer dizer aqui: "Em seguida, adicione o caminho para Git \ bin \ na sua variável PATH."
BKSpurgeon

2
@BKSpurgeon - Se você clicar com o botão direito do mouse em Computador e selecionar Propriedades, poderá clicar em Configurações avançadas do sistema no lado esquerdo da tela. No pop-up, clique variáveis de ambiente e, em seguida, adicionar ou atualizar a variável PATH em suas variáveis de usuário com bin Git \ \
Tim Hutchison

@JustinCormack Você tem alguma referência para isso? Eu apenas tentei diff em Git Bash e funcionou
Tim Hutchison

3
@ Tim Hutchison, da sua resposta: "Isso fornecerá não apenas diff, mas também muitos outros comandos linux que você pode usar na linha de comando do Windows." - quais você quer dizer? Quando alguém instala o Git, ele / ela deve ter apenas git...executáveis ​​disponíveis no PATH. Além disso, a resposta provavelmente deve incluir uma informação importante: você precisa iniciar a ferramenta diff escrevendo git diff, não apenas diff.
Petr Bodnár 15/09/18

cara, isso é totalmente outrodiff
vintproykt 17/01

14

O FC funciona muito bem no meu caso, não foi útil, pois eu queria apenas as linhas que foram alteradas. E o FC fornece dados adicionais, como nome de arquivo, mesmas linhas e comparação bilateral.

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

mas, no meu caso, queria apenas as linhas que foram alteradas e queria que essas linhas fossem exportadas para um arquivo diferente, sem nenhum outro cabeçalho ou dados.

Então eu usei "findstr" para comparar o arquivo:

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

Onde :

data.txt.bak é o nome do arquivo antigo

data.txt é o nome do novo arquivo

DiffResult.txt contém os dados que são alterados, ou seja, apenas uma linha #### 09


1
/ Uma única primeira linha e da última linha de bloco que é alterado / N números mostram linha
Lukas

10

fc. fc é melhor para lidar com arquivos grandes (> 4 GBytes) do que o diff do Cygwin.


10

Há também o Powershell (que faz parte do Windows). Não é rápido, mas é flexível, eis o comando básico. As pessoas criaram vários cmdlets e scripts para isso, se você precisar de uma formatação melhor.

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

Não faz parte do Windows, mas se você é desenvolvedor do Visual Studio, ele vem com o WinDiff (gráfico)

Mas o meu favorito é o BeyondCompare, que custa US $ 30.


4

DiffUtils é provavelmente a sua melhor aposta. É o equivalente do Windows ao diff.

Que eu saiba, não há equivalentes embutidos.


No entanto, também usei isso hoje. Descobri que a versão bastante antiga 2.8.7 fornecida nessa página tem um bug (ao comparar determinados arquivos PDF, eles são relatados como iguais). Então agora preferindo o "git diff" como sugerido pela luz do fogo.
anre 27/10/16

4

A razão pela qual você obteve o erro com o COMP é que o utilitário assume que os arquivos que você está comparando são do mesmo tamanho. Para superar isso, você pode usar a '/n'opção com a qual pode especificar o número de linhas que deseja comparar. (veja as opções suportadas pelo comp digitando 'comp /?'na linha de comando. para que seu comando se pareça com:

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

Isso deve resolver seu problema se você quiser usar o COMP. Mas isso será um problema para arquivos muito grandes.

Embora compseja uma opção, mas eu acho que é primitivo e FCé uma opção melhor. você pode usar FORFILESe, FCjuntos, provavelmente fazer um utilitário de comparação de arquivos realmente bom, se precisar de um com frequência.

FC é usado desta maneira para ref:

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

existem muitas opções disponíveis que você pode ver na 'fc /?' esperança de que isso ajude




0

Não sei se a ferramenta a seguir é exatamente o que você precisa. Mas eu gosto de usar, para arquivos específicos, alguma ferramenta online. Dessa forma, eu posso usá-lo independentemente do sistema operacional. Aqui está um exemplo: diffchecker.com

Mas, para as minhas necessidades, acho que a melhor ferramenta para rastrear alterações e logs dos arquivos do meu projeto é o GIT. Se você trabalha em equipe, pode ter alguns repositórios on-line em um servidor seu ou usá-lo com o Bitbucket ou o Github.

Espero que ajude alguém.


0

Se você instalou o git em sua máquina, poderá abrir um terminal git e apenas usar o diffcomando Linux normalmente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.