Comando diff: comparação de arquivos, formato de patch do diff -u e opções

Ambiente de testeFamília RHELAlmaLinux 9.8conta root
Comandos para ver · editar textodiffLocalização/usr/bin/diff

O comando diff é um comando do Linux que compara dois arquivos linha por linha e mostra apenas as linhas diferentes. Ao comparar com diff um arquivo antigo e um novo que imitam a configuração de um servidor web, os três pontos alterados apareceram nas três linhas 2,3c2,3, 5d4 e 6a6, e no arquivo de patch salvo com a opção -u as mesmas alterações ficaram organizadas com sinais de menos e de mais.

Os nomes e o conteúdo dos arquivos na saída abaixo e a pasta de trabalho /root/work são valores de exemplo. Todos os arquivos comparados são arquivos pequenos criados para teste.

1️⃣ Uso básico do comando diff e leitura da saída

A forma básica do comando é diff, opções, primeiro arquivo e segundo arquivo, nessa ordem. Ele mostra, com os números de linha, quais linhas precisam ser alteradas, apagadas ou adicionadas para que o primeiro arquivo fique igual ao segundo.

Os dois arquivos usados na comparação são arquivos de seis linhas que imitam a configuração de um servidor web.

cd /root/work
cat config-old.conf
# app config
listen 80
server_name example.com
root /var/www/html
gzip off
log_level warn
cat config-new.conf
# app config
listen 443
server_name example.com www.example.com
root /var/www/html
log_level warn
cache on

Os dois arquivos foram comparados sem opções.

diff config-old.conf config-new.conf
2,3c2,3
< listen 80
< server_name example.com
---
> listen 443
> server_name example.com www.example.com
5d4
< gzip off
6a6
> cache on
echo $?
1

Na saída, linhas de posição e linhas de conteúdo aparecem alternadas. A letra do meio de uma linha de posição é c para alterar, d para apagar e a para adicionar; à esquerda da letra ficam os números de linha do primeiro arquivo e à direita os do segundo. Quando há diferença, o código de saída é 1.

SaídaSignificado
2,3c2,3Altera as linhas 2–3 do primeiro arquivo para as linhas 2–3 do segundo arquivo (change)
5d4Apaga a linha 5 do primeiro arquivo (delete). Depois de apagada, fica alinhada após a linha 4 do segundo arquivo
6a6Adiciona a linha 6 do segundo arquivo depois da linha 6 do primeiro arquivo (add)
< linhaLinha que está no primeiro arquivo
> linhaLinha que está no segundo arquivo
---Limite entre o lado do primeiro arquivo e o do segundo arquivo nas linhas alteradas (c)

Ao comparar arquivos com o mesmo conteúdo, nada é mostrado e o comando termina com o código de saída 0.

diff config-old.conf config-copy.conf
echo $?
0

Ao informar um arquivo que não existe, aparece uma mensagem de erro e o código de saída é 2.

diff config-old.conf nosuch.conf
diff: nosuch.conf: No such file or directory
echo $?
2

Em um script, esses três valores permitem distinguir igual, diferente e erro.

2️⃣ Formato unificado do diff -u e arquivos de patch

Por padrão, a saída mostra apenas as linhas alteradas, então em um arquivo de configuração com centenas de linhas é difícil saber perto de qual ajuste elas estão. Com -u, a saída vem no formato unificado (unified), que agrupa até três linhas antes e depois das linhas alteradas.

diff -u config-old.conf config-new.conf
--- config-old.conf     2026-10-29 02:24:50.840228932 +0000
+++ config-new.conf     2026-10-29 02:24:50.840228932 +0000
@@ -1,6 +1,6 @@
 # app config
-listen 80
-server_name example.com
+listen 443
+server_name example.com www.example.com
 root /var/www/html
-gzip off
 log_level warn
+cache on

As duas linhas de cabeçalho (---, +++) mostram o nome e a hora de modificação dos dois arquivos, e a linha @@ -1,6 +1,6 @@ é um bloco (hunk) que agrupa 6 linhas a partir da linha 1 do primeiro arquivo e 6 linhas a partir da linha 1 do segundo. Nas linhas abaixo, um - no início indica uma linha apagada do primeiro arquivo, um + uma linha adicionada ao segundo arquivo e um espaço uma linha que está igual nos dois arquivos.

-c é o formato de contexto (context). Ele mostra separadamente o bloco do primeiro arquivo e o do segundo, com um ponto de exclamação antes das linhas alteradas, um sinal de menos nas apagadas e um sinal de mais nas adicionadas.

diff -c config-old.conf config-new.conf
*** config-old.conf     Thu Oct 29 02:24:50 2026
--- config-new.conf     Thu Oct 29 02:24:50 2026
***************
*** 1,6 ****
  # app config
! listen 80
! server_name example.com
  root /var/www/html
- gzip off
  log_level warn
--- 1,6 ----
  # app config
! listen 443
! server_name example.com www.example.com
  root /var/www/html
  log_level warn
+ cache on

Com as mesmas alterações, -c ficou mais longo que -u porque as linhas inalteradas aparecem uma vez em cada um dos dois blocos.

Ao salvar a saída de -u em um arquivo, esse arquivo já é o arquivo de patch. Mesmo enviando a saída para um arquivo, o código de saída do diff continua sendo 1.

diff -u config-old.conf config-new.conf > /root/work/config.patch
echo $?
1
cat /root/work/config.patch
--- config-old.conf     2026-10-29 02:24:50.840228932 +0000
+++ config-new.conf     2026-10-29 02:24:50.840228932 +0000
@@ -1,6 +1,6 @@
 # app config
-listen 80
-server_name example.com
+listen 443
+server_name example.com www.example.com
 root /var/www/html
-gzip off
 log_level warn
+cache on

O conteúdo do arquivo salvo é igual ao resultado de -u mostrado na tela. Ao passar esse arquivo para o comando patch, o primeiro arquivo pode ficar com o mesmo conteúdo do segundo.

3️⃣ Opções do diff e como ignorar espaços e maiúsculas

Ao copiar configurações à mão, surgem linhas com o mesmo conteúdo que diferem apenas em maiúsculas ou espaços. O segundo par de arquivos de exemplo troca o L maiúsculo da primeira linha por minúsculo, transforma um espaço da segunda linha em dois e adiciona uma linha em branco.

cat case-a.txt
Listen 80
ServerName example.com
DocumentRoot /var/www/html
cat case-b.txt
listen 80
ServerName  example.com

DocumentRoot /var/www/html
diff case-a.txt case-b.txt
1,2c1,3
< Listen 80
< ServerName example.com
---
> listen 80
> ServerName  example.com
>

Na comparação sem opções, as linhas 1–2, que têm o mesmo significado, também aparecem como linhas alteradas. Ao ignorar maiúsculas com -i, a linha Listen some e sobra apenas a linha 2 do primeiro arquivo.

diff -i case-a.txt case-b.txt
2c2,3
< ServerName example.com
---
> ServerName  example.com
>

Ao acrescentar -w, todos os espaços dentro da linha são ignorados, então a linha ServerName também passa a ser igual e sobra apenas a linha em branco adicionada na linha 3. Usando -b, que ignora só a quantidade de espaços, no lugar de -w, o resultado foi o mesmo com esses arquivos.

diff -i -w case-a.txt case-b.txt
2a3
>

Acrescentando também -B, as diferenças de linhas em branco são ignoradas, e o comando terminou sem saída com o código de saída 0.

diff -i -w -B case-a.txt case-b.txt
echo $?
0

Para ver os dois arquivos lado a lado, à esquerda e à direita, usa-se -y. A largura padrão é de 130 colunas, por isso foi reduzida com -W 70.

diff -y -W 70 config-old.conf config-new.conf
# app config                            # app config
listen 80                         |     listen 443
server_name example.com           |     server_name example.com www.ex
root /var/www/html                      root /var/www/html
gzip off                          <
log_level warn                          log_level warn
                                  >     cache on

A barra vertical (|) no meio indica uma linha alterada, < uma linha que só está no primeiro arquivo e > uma linha que só está no segundo. Ao reduzir a largura, as linhas longas são cortadas. A linha server_name apareceu à direita só até www.ex.

Ao acrescentar --suppress-common-lines, as linhas iguais são retiradas e ficam apenas as diferentes.

diff -y --suppress-common-lines -W 70 config-old.conf config-new.conf
listen 80                         |     listen 443
server_name example.com           |     server_name example.com www.ex
gzip off                          <
                                  >     cache on

Para verificar apenas se os arquivos são iguais ou diferentes, e não o conteúdo das diferenças, usa-se -q. Quando os arquivos são iguais, -q não mostra nada; para receber uma linha dizendo que são iguais, usa-se -s.

diff -q config-old.conf config-new.conf
Files config-old.conf and config-new.conf differ
diff -s config-old.conf config-copy.conf
Files config-old.conf and config-copy.conf are identical

As opções estão reunidas nas duas abas abaixo.

OpçãoCopiarDescrição
-u, --unifiedMostra no formato unificado, que agrupa até três linhas antes e depois das linhas alteradas
-c, --contextFormato de contexto, que mostra separadamente o bloco do primeiro arquivo e o do segundo
-i, --ignore-caseIgnora diferenças entre maiúsculas e minúsculas
-w, --ignore-all-spaceIgnora todos os espaços dentro da linha
-b, --ignore-space-changeIgnora apenas diferenças na quantidade de espaços
-B, --ignore-blank-linesIgnora diferenças de linhas em branco
-y, --side-by-sideMostra os dois arquivos lado a lado, à esquerda e à direita
-W, --widthNUMDefine a largura da saída lado a lado. O valor padrão é 130 colunas
--suppress-common-linesNa saída lado a lado, retira as linhas iguais e mostra apenas as diferentes
-q, --briefMostra apenas se são iguais ou diferentes. Se forem iguais, não mostra nada
-s, --report-identical-filesMostra uma linha dizendo que são iguais quando os dois arquivos são iguais
-r, --recursiveCompara também os arquivos dentro das subpastas
OpçãoCopiarDescrição
-U, --unifiedNUMDefine quantas linhas antes e depois são mostradas junto no formato unificado. O valor padrão é 3
-N, --new-fileTrata como arquivo vazio o arquivo que falta em um dos lados
-x, --excludePATExclui da comparação os arquivos cujo nome corresponde ao padrão
-I, --ignore-matching-linesREIgnora a diferença se todas as linhas alteradas correspondem à expressão regular
-Z, --ignore-trailing-spaceIgnora espaços no fim da linha
-E, --ignore-tab-expansionIgnora diferenças causadas pela conversão de tabulações em espaços
-a, --textTrata todos os arquivos como texto
--strip-trailing-crRemove o retorno de carro do fim da linha antes de comparar
--colorWHENColoca cor na saída. WHEN é never, always ou auto
-v, --versionMostra as informações de versão

🔲 Simulador do comando diff

No simulador abaixo, é possível digitar diff diretamente com os arquivos de exemplo do artigo. Dá para salvar um arquivo de patch com -u ou comparar com -i -w -B e -rq, e, ao adicionar uma linha a config-new.conf e comparar de novo, aparece o resultado alterado.

Simulador do comando diffdiff · conta root
[root@server work]#
Use as teclas ↑↓ para chamar de volta os comandos digitados antes.

4️⃣ Comparar pastas com diff -r

Para comparar vários arquivos de uma vez, como antes e depois de publicar os arquivos de um site, escrevem-se nomes de pasta no lugar dos arquivos. As pastas de exemplo site-v1 e site-v2 têm ambas index.html e uma pasta css, enquanto about.html e contact.html estão em apenas um dos lados.

diff site-v1 site-v2
Only in site-v1: about.html
Only in site-v2: contact.html
Common subdirectories: site-v1/css and site-v2/css
diff site-v1/index.html site-v2/index.html
2,3c2,3
< <p>Version 1</p>
< <a href="about.html">About</a>
---
> <p>Version 2</p>
> <a href="contact.html">Contact</a>

Ao comparar pastas sem opções, os arquivos que só estão em um lado aparecem como linhas [Only in] e as subpastas apenas como linhas [Common subdirectories], sem que os arquivos dentro delas sejam comparados. Para index.html, que está com o mesmo nome nas duas pastas, as diferenças aparecem abaixo da linha [diff site-v1/index.html site-v2/index.html]. Com -r, aparece também o valor de cor alterado em style.css, dentro da pasta css.

diff -r site-v1 site-v2
Only in site-v1: about.html
Only in site-v2: contact.html
diff -r site-v1/css/style.css site-v2/css/style.css
2c2
< h1 { color: #222; }
---
> h1 { color: #0a58ca; }
diff -r site-v1/index.html site-v2/index.html
2,3c2,3
< <p>Version 1</p>
< <a href="about.html">About</a>
---
> <p>Version 2</p>
> <a href="contact.html">Contact</a>

Em uma pasta com muitos arquivos, primeiro se confere com -rq a lista de arquivos alterados e depois se comparam de novo com diff apenas os arquivos necessários.

diff -rq site-v1 site-v2
Only in site-v1: about.html
Only in site-v2: contact.html
Files site-v1/css/style.css and site-v2/css/style.css differ
Files site-v1/index.html and site-v2/index.html differ

🔢 FAQ & conteúdo recomendado

cmp compara dois arquivos byte a byte e mostra apenas a primeira posição em que diferem. Ao comparar com cmp os dois arquivos de configuração do artigo, o resultado foi a única linha [config-old.conf config-new.conf differ: char 21, line 2]. Ele é usado para verificar se arquivos compactados ou imagens, em que a comparação linha por linha não faz sentido, são iguais.

Passe ao comando patch o arquivo original e o arquivo de patch, nessa ordem ([patch config-old.conf config.patch]). patch altera o arquivo original no próprio lugar, então grave o resultado em outro arquivo com -o ou aplique primeiro em uma cópia.

A opção --color[=WHEN] coloca cor, e no lugar de WHEN entra never, always ou auto. --color sem valor equivale a auto e só coloca cor quando a saída vai para um terminal; por isso, para manter a cor ao passar a saída para outro comando como less, usa-se --color=always.

ℹ️ Aviso de afiliados
O conteúdo deste site contém links de afiliados. Quando um visitante compra um produto ou serviço por meio de um desses links, o site recebe uma comissão do vendedor. O valor que o comprador paga (em promoções, ele diminui ↓) não aumenta por causa disso. Preços, descontos e informações de estoque valem para o momento em que o texto foi escrito e podem ter mudado, por isso confirme com o vendedor antes de comprar. Os produtos são escolhidos e avaliados por critérios próprios, e o recebimento de comissão não influencia a ordem de apresentação nem o conteúdo das avaliações.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Demonstre sua humanidade: 1   +   6   =