Comando diff: comparação de arquivos, formato de patch do diff -u e opções
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/workcat config-old.conf# app config
listen 80
server_name example.com
root /var/www/html
gzip off
log_level warncat config-new.conf# app config
listen 443
server_name example.com www.example.com
root /var/www/html
log_level warn
cache onOs dois arquivos foram comparados sem opções.
diff config-old.conf config-new.conf2,3c2,3
< listen 80
< server_name example.com
---
> listen 443
> server_name example.com www.example.com
5d4
< gzip off
6a6
> cache onecho $?1Na 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ída | Significado |
|---|---|
| 2,3c2,3 | Altera as linhas 2–3 do primeiro arquivo para as linhas 2–3 do segundo arquivo (change) |
| 5d4 | Apaga a linha 5 do primeiro arquivo (delete). Depois de apagada, fica alinhada após a linha 4 do segundo arquivo |
| 6a6 | Adiciona a linha 6 do segundo arquivo depois da linha 6 do primeiro arquivo (add) |
| < linha | Linha que está no primeiro arquivo |
| > linha | Linha 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.confecho $?0Ao 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.confdiff: nosuch.conf: No such file or directoryecho $?2Em 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 onAs 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 onCom 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.patchecho $?1cat /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 onO 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.txtListen 80
ServerName example.com
DocumentRoot /var/www/htmlcat case-b.txtlisten 80
ServerName example.com
DocumentRoot /var/www/htmldiff case-a.txt case-b.txt1,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.txt2c2,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.txt2a3
>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.txtecho $?0Para 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 onA 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.conflisten 80 | listen 443
server_name example.com | server_name example.com www.ex
gzip off <
> cache onPara 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.confFiles config-old.conf and config-new.conf differdiff -s config-old.conf config-copy.confFiles config-old.conf and config-copy.conf are identicalAs opções estão reunidas nas duas abas abaixo.
| Opção | Copiar | Descrição |
|---|---|---|
| -u, --unified | Mostra no formato unificado, que agrupa até três linhas antes e depois das linhas alteradas | |
| -c, --context | Formato de contexto, que mostra separadamente o bloco do primeiro arquivo e o do segundo | |
| -i, --ignore-case | Ignora diferenças entre maiúsculas e minúsculas | |
| -w, --ignore-all-space | Ignora todos os espaços dentro da linha | |
| -b, --ignore-space-change | Ignora apenas diferenças na quantidade de espaços | |
| -B, --ignore-blank-lines | Ignora diferenças de linhas em branco | |
| -y, --side-by-side | Mostra os dois arquivos lado a lado, à esquerda e à direita | |
| -W, --widthNUM | Define a largura da saída lado a lado. O valor padrão é 130 colunas | |
| --suppress-common-lines | Na saída lado a lado, retira as linhas iguais e mostra apenas as diferentes | |
| -q, --brief | Mostra apenas se são iguais ou diferentes. Se forem iguais, não mostra nada | |
| -s, --report-identical-files | Mostra uma linha dizendo que são iguais quando os dois arquivos são iguais | |
| -r, --recursive | Compara também os arquivos dentro das subpastas |
| Opção | Copiar | Descrição |
|---|---|---|
| -U, --unifiedNUM | Define quantas linhas antes e depois são mostradas junto no formato unificado. O valor padrão é 3 | |
| -N, --new-file | Trata como arquivo vazio o arquivo que falta em um dos lados | |
| -x, --excludePAT | Exclui da comparação os arquivos cujo nome corresponde ao padrão | |
| -I, --ignore-matching-linesRE | Ignora a diferença se todas as linhas alteradas correspondem à expressão regular | |
| -Z, --ignore-trailing-space | Ignora espaços no fim da linha | |
| -E, --ignore-tab-expansion | Ignora diferenças causadas pela conversão de tabulações em espaços | |
| -a, --text | Trata todos os arquivos como texto | |
| --strip-trailing-cr | Remove o retorno de carro do fim da linha antes de comparar | |
| --colorWHEN | Coloca cor na saída. WHEN é never, always ou auto | |
| -v, --version | Mostra 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.
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-v2Only 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-v2Only 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-v2Only 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
Linux · Texto
Comando grep do Linux
Como usar o grep para encontrar e mostrar apenas as linhas que contêm o texto desejado em um arquivo de texto, como um arquivo de log.
Linux · Texto
Comando sort do Linux: ordenar arquivos
Opções e exemplos do sort para ordenar o conteúdo de um arquivo em ordem alfabética, crescente ou decrescente.
Linux · Texto
Comando uniq do Linux
Como usar o uniq para manter só uma das linhas repetidas e contar com -c quantas vezes elas se repetem.
ℹ️ 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.