Comando diff

Comando diff

O comando diff faz comparação entre arquivos e diretórios.

Neste exemplo vou copiar o cabeçalho do manual apropos e o manual du com o comando head e com o sinal de ( > ) vou colocar o conteúdo em um novo arquivo que será criado.

Dica:  no linux esses sinais ( > ) = indica atribuição ou seja quando você usa somente um sinal de maior tudo que foi digitado ou copiado será atribuído ao novo arquivo, agora se você usar (>>) = indica que será atribuido tudo que foi digitado e copiado com uma diferença ele continua atribuindo valores diferente do primeiro caso que copia por cima do que tinha sido criado.

[caption id="" align="aligncenter" width="400"]Usando o head para abrir o arquivo e redirecionando para o arquivo cab_apr head apr > cab_apr  ;  head du > cab_du
[/caption]

Com esses dois comandos foram criados dois arquivos cab_apr e o cab_du.

Agora vou comparar os dois cabeçalhos com o comando diff sem parâmetros.

[caption id="" align="aligncenter" width="400"]Comparando os arquivos diff cab_apr cab_du diff cab_apr cab_du[/caption]

 

Comparando os arquivos diff -p cabe_apr cabe_du usando parametroBasicamente é isso que esse comando faz para mais informação man diff.

Manpage diff comando man diff

Nome diff

Exibir as diferenças entre dois arquivos ou cada arquivo correspondente em dois diretórios.
Cada conjunto de diferenças é chamado de “dif” ou “patch”. Para arquivos que são idênticos, o diff normalmente não produz saída; para arquivos binários (não-texto), o diff geralmente relata apenas que eles são diferentes.

  Sintaxe

       Diferente [ opções ] ARQUIVOS 
  Opções 

As múltiplas opções de uma única letra (a menos que eles tomem um argumento) podem ser combinadas em uma única palavra de linha de comando: então `-ac ‘é equivalente a` -a -c’.

  ARQUIVOS são 'FILE1 FILE2' ou 'DIR1 DIR2' ou 'DIR FILE ...' ou 'FILE ... DIR'.
 Se o arquivo - de arquivo ou - para o arquivo for fornecido, não há restrições em arquivos.
 Se um FILE for '-', leia a entrada padrão. 
    -uma
    --texto
        Trate todos os arquivos como texto.

    -b
    - ignore-space-change
        Ignore as mudanças na quantidade de espaço em branco. 

    -B
    --ignore-blank-lines
        Ignore as alterações cujas linhas estão todas em branco. 
  
    -c NUM
    -C NUM 
    --context [= NUM ]
        Saída NUM (padrão 3) linhas de contexto copiado.

    -d
    --mínimo
        Tente difícil encontrar um conjunto menor de mudanças.

    -e
    --ed
        Saída de um script ed.

    -E
    - ignorar-tab-expansão
        Ignore as alterações devido à expansão da guia.

    -F RE 
    --show-function-line = RE
        Mostre a linha de linha mais recente RE .

    --Socorro
        Saia esta ajuda.

    --horizon-lines = NUM
        Mantenha NUM linhas do prefixo comum e sufixo.

    -Eu
    --ignorar caso
        Ignore as diferenças de casos no conteúdo do arquivo.

    --ignore-file-name-case
        Ignore caso ao comparar nomes de arquivos.

    - ignorar-arquivo-nome-caso
        Considere caso ao comparar nomes de arquivos.

    - etiqueta LABEL
        Use LABEL em vez do nome do arquivo.

    --coluna esquerda
        Produza apenas a coluna esquerda de linhas comuns.

    -eu
    --paginar
        Passe a saída através de 'pr' para paginá-lo.

    -N
    --novo arquivo
        Trate os arquivos ausentes como vazios. 
    --normal
        Produza uma diferença normal.

    -n
    --rcs
        Saída de um formato RCS.

    -p
    --show-c-function
        Mostre qual função C cada mudança está em. 

    -q
    --breve
        Produza apenas se os arquivos são diferentes.

    -r
    --recursivo
        Compara recursivamente todos os subdiretórios encontrados.

    --strip-trailing-cr
        Retornar a faixa de trilha na entrada.
 
    -S FILE
    - start-file = FILE
        Comece com FILE ao comparar diretórios.

    -s
    - arquivos de relatório-idênticos
        Informe quando dois arquivos são os mesmos.

    - velocidade-arquivos grandes
        Assuma arquivos grandes e muitas pequenas mudanças dispersas.

    - Suporte - linhas comuns
        Não produz linhas comuns.

    -t
    --Expand-tabs
        Expanda abas para espaços na saída.

    -T
    - guia inicial
        Faça as abas se alinha fazendo uma separação.

    --unidirecional-novo-arquivo
        Trate os primeiros arquivos ausentes como vazios.

    -u NUM
    -U NUM 
    --unificado [= NUM ]
        Output NUM (padrão 3) linhas de contexto unificado. 
    -v
    --versão
        Informação da versão de saída.

    -W
    --ignore-all-space
        Ignore todo o espaço em branco.

    -W NUM
    --width = NUM
        Produza no máximo NUM (130 padrão) colunas de impressão.

    -x PAT
    --exclude = PAT
        Excluir arquivos que combinam PAT .

    -X ARQUIVO
    --exclude-from = FILE
        Exclua os arquivos que correspondem a qualquer padrão no arquivo .

    -y
    --lado a lado
        Saída em duas colunas.

    --de arquivo = FILE1
        Compare FILE1 para todos os operandos.  FILE1 pode ser um diretório. 

    - to-file = FILE2
        Compare todos os operandos com o FILE2.  FILE2 pode ser um diretório. 


     -DNAME
    --ifdef = NOME
        Saída do arquivo mesclado para mostrar '#ifdef NAME ' diffs.

    --GTYPE-group-format = GFMT
        Similar, mas formate os grupos de entrada GTYPE com o GFMT.

    -I REGEXP
    --ignore-matching-lines = REGEXP
        Ignore as alterações cujas linhas coincidem com REGEXP . 

    - line-format = LFMT
        Similar, mas formatar todas as linhas de entrada com LFMT. 

    --LTYPE-line-format = LFMT
        Similar, mas o formato LTYPE linhas de entrada com LFMT . 
           LTYPE é "antigo", "novo" ou "inalterado".
           GTYPE é LTYPE ou 'mudou'. 
    GFMT pode conter:
    % <linhas do FILE1 
    %> linhas do FILE2 
    % = linhas comuns a FILE1 e FILE2 
    % [-] [WIDTH] [. [PREC]] {doxX} LETTER
             especificação printf-style para LETTER 
    LETTERs são os seguintes para o novo grupo, minúsculas para o grupo antigo:
    F número da primeira linha 
    L número da última linha 
    N número de linhas = L-F + 1 
    E F-1 
    M L + 1

    LFMT pode conter:
    % L conteúdo da linha 
    % l conteúdo da linha, excluindo qualquer nova linha 
    % [-] [WIDTH] [. [PREC]] {doxX} n
             Especificação de estilo printf para o número da linha de entrada

    GFMT ou LFMT podem conter:
    %%% 
    % c'C 'O personagem único C 
    % c '\ OOO' O personagem com código octal OOO 

No caso mais simples, diff compara o conteúdo dos dois arquivos de-arquivo e arquivo . Um nome de arquivo – significa texto lido a partir da entrada padrão.

Se do arquivo é um diretório e o arquivo não é, diff compara o arquivo no arquivo cujo nome de arquivo é o de arquivo e vice-versa. O arquivo não-diretório não deve ser -.

Se ambos os arquivos de arquivos e arquivos são diretórios, o diff compara os arquivos correspondentes em ambos os diretórios, em ordem alfabética; esta comparação não é recursiva a menos que a opção -r ou –recursive seja dada.

GNU `diff ‘pode mostrar se os arquivos são diferentes sem detalhar as diferenças.
Ele também fornece maneiras de suprimir certos tipos de diferenças que não são importantes para você.

Mais comumente, tais diferenças são mudanças na quantidade de espaço em branco entre palavras ou linhas. `diff ‘também fornece maneiras de suprimir diferenças em casos alfabéticos ou em linhas que combinam uma expressão regular que você fornece.

Essas opções podem se acumular; Por exemplo, você pode ignorar as mudanças no espaço em branco e no caso alfabético.

Marcadores de fim de linha

Nos sistemas operacionais que distinguem o texto e os arquivos binários, o `diff ‘normalmente lê e

grava todos os dados como texto.

Use a opção `–binary ‘para forçar` diff’ para ler e escrever dados binários. Esta opção não tem efeito em um sistema compatível com Posix, como o GNU ou o Unix tradicional. No entanto, muitos sistemas operacionais de computadores pessoais representam o fim de uma linha com um retorno de carro seguido de uma nova linha.

Em tais sistemas, `diff ‘normalmente ignora esses retornos de carro na entrada e os gera no final de cada linha de saída, mas com a opção` –binary’ `diff ‘trata cada retorno de carro como apenas outro caractere de entrada e não gerar um retorno de carro no final de cada linha de saída.

Isso pode ser útil ao lidar com arquivos que não sejam de texto que devem ser trocados com sistemas compatíveis com Posix.

Ignorar caso

GNU `diff ‘pode tratar letras minúsculas como equivalentes às suas contrapartes maiúsculas, de modo que, por exemplo, considera” Funky Stuff “,” funky STUFF “e” FUNKy stuFf “para serem iguais.
Para solicitar isso, use a opção `-i ‘ou` –ignore-case’.

Supressão de linhas que combinam uma expressão regular

Para ignorar inserções e exclusões de linhas que combinam uma expressão regular, use a opção `-I REGEXP ‘ou` –ignore-matching-lines = REGEXP’.

Você deve escapar de expressões regulares que contenham personagens do shell para impedir que o shell os expanda.

Por exemplo, diff – I ‘^ [0-9]’ ignora todas as alterações em linhas que começam com um dígito.
No entanto, eu apenas ignoro a inserção ou exclusão de linhas que contêm a expressão regular, se cada linha alterada no pedaço – cada inserção e cada exclusão – corresponda à expressão regular.
Em outras palavras, para cada mudança não ignorável, `diff ‘imprime o conjunto completo de mudanças em sua vizinhança, incluindo os ignoráveis. Você pode especificar mais de uma expressão regular para linhas para ignorar usando mais de uma opção

`-I ‘. `diff ‘ tenta combinar cada linha com cada expressão regular, começando com a última dada.

Resumindo quais arquivos diferem

Quando você quer apenas descobrir se os arquivos são diferentes e você não se importa quais são as diferenças, você pode usar o formato de saída de resumo.

Neste formato, em vez de mostrar as diferenças entre os arquivos, `diff ‘simplesmente relata se os arquivos são diferentes.

As opções `-q ‘e` –brief’ selecionam esse formato de saída.

Este formato é especialmente útil ao comparar os conteúdos de dois diretórios. Também é muito mais rápido do que fazer as comparações normais de linha a linha, porque `diff ‘pode parar de analisar os arquivos assim que ele sabe que existem diferenças.
Você também pode obter uma breve indicação de se dois arquivos diferem usando `cmp ‘.

Usando diff para corrigir um arquivo

Para mostrar contexto em torno das diferentes linhas, o GNU `diff ‘fornece esses formatos de saída
Formato normal: um formato de saída que mostra cada fraco de diferenças sem qualquer contexto circundante.

Formato de Contexto :: Um formato de saída que mostra linhas circundantes.
Formato Unificado :: Um formato de saída mais compacto que mostra o contexto
`patch ‘pode aplicar diffs pesquisando nos arquivos para as linhas de contexto em torno das diferentes linhas; se essas linhas estão realmente a poucas linhas de onde o diff diz que são, `patch ‘pode ajustar os números de linha de acordo e ainda aplicar o diff corretamente.

Exemplo

$ diff -q <(classificar arquivo1.txt | uniq) <(classificar arquivo2.txt | uniq)

O comando acima retornará 0 se file1.txt = file2.txt e retornará 1 se file1.txt ≠ file2.txt
Observe que os arquivos devem ser classificados primeiro (o pedido é importante) e se os arquivos puderem conter valores duplicados, então a saída de ordenação deve ser executada através do comando uniq para eliminar quaisquer elementos duplicados.

Para obter mais informações sobre como corrigir arquivos e produzir comandos que direcionem o editor de texto `ed ‘para editar um arquivo – execute informações diff

Relacionado:

cmp – Compare dois arquivos

dircmp – Compare 2 diretórios

diff3 – Mostrar diferenças entre três arquivos

sdiffMisture dois arquivos de forma interativa

Comandos equivalentes do Windows: COMP / FC / WINDIFF (GUI) – Compare e exiba caracteres / linhas que não correspondem.

 

Anúncios