O que significa um ponto de exclamação na saída do diff?

4

Eu tenho uma tarefa para a escola. Uma parte é verificar as alterações em um arquivo e gravar essas alterações em um arquivo de log. Até agora eu encontrei o comando diff que poderia ser útil na minha opinião. Digamos que eu tenha dois arquivos com conteúdo como este:

arquivo1

orange
apple

arquivo2

orange
apple
strawberry

Se eu usar diff -c file1 file2 neste caso, a saída do comando é

*** file1   2016-11-24 08:31:19.424712242 +0100
--- file2   2016-11-24 08:25:24.604681751 +0100
***************
*** 1,2 ****
--- 1,3 ----
  orange
  apple
+ strawberry

que eu acho que diz que a linha com o sinal '+' precisa ser adicionado ao arquivo1 para que eles sejam iguais (?).

Agora digamos que eu mude o arquivo1 para isso:

orange
apple
peach

A saída de diff -c file1 file2 é:

*** file1   2016-11-24 08:34:50.647128312 +0100
--- file2   2016-11-24 08:25:24.604681751 +0100
***************
*** 1,3 ****
  orange
  apple
! peach
--- 1,3 ----
  orange
  apple
! strawberry

E aqui estou perdido, porque não entendo o que esses pontos de exclamação significam. De repente, o comando diff não parece tão útil. Eu tentei olhar para a man page do comando diff, mas não consigo encontrar nada (talvez eu simplesmente não veja).

    
por Denco 24.11.2016 / 08:41

3 respostas

9
  • diff -u

pode ser o que você precisa para sua tarefa.

Para pegar seu exemplo e usar diff -u

michael@x071:[/home/michael]diff -u file?
--- file1       2016-11-24 07:48:41 +0000
+++ file2       2016-11-24 07:48:57 +0000
@@ -1,3 +1,3 @@
 orange
 apple
-peach
+strawberry

Espero que isso ajude com sua tarefa

Um conselho - RTM - ou - Leia o manual. Muitas vezes há outras opções. FYI: as opções históricas de diff (e diff3 ao comparar três arquivos) foram para auxiliar na criação do "programa inout" que mudaria o arquivo1 para o arquivo2 (ou o arquivo2 de volta para o arquivo1). Esta tem sido a base de todo o software "controle de versão".

As opções de diferenças das quais me lembro há muito tempo:

  • -e: Produz saída em um formato adequado para uso com o editor ed para converter Arquivo1 em Arquivo2.
  • -f: Produz saída em um formato não adequado para uso com o editor ed, mostrando as modificações necessárias para converter Arquivo1 em Arquivo2 na ordem inversa daquela produzida sob o sinalizador -e.
  • -n: Produz uma saída semelhante àquela do sinalizador -e, mas na ordem oposta e com uma contagem de linhas alteradas em cada comando de inserção ou exclusão. Esta é a forma usada pelo sistema de controle de revisão (RCS).

A última opção que vou destacar é uma "nova" - relativamente falando. (também vários anos, mas muitas vezes não estava em implementações POSIX). Em vez de criar saída adequada para 'ed' de 'RCS', isso é adequado para 'patch'

  • -u: Produz uma comparação do comando diff com três linhas de contexto unificado. A saída é semelhante àquela do sinalizador -c, exceto que as linhas de contexto não são repetidas; em vez disso, o contexto, as linhas excluídas e adicionadas são mostradas juntas, intercaladas.

IMHO: o valor da chave do diff -c é como uma melhoria em relação ao comando 'cmp' - quando você quer saber mais do que SOMENTE se dois arquivos diferem ou não. Eu nunca tinha prestado atenção (talvez seja uma opção "nova" também) - mas deve pensar nisso quando a minha pergunta for uma busca recursiva por arquivos que diferem entre duas árvores de diretório.

    
por 24.11.2016 / 08:52
4

A saída de diff é formada por blocos, correspondendo cada fragmento a um conjunto de alterações. A linha *************** marca o início de tal parte.

Cada pedaço fornece o contexto nos arquivos. *** 1,3 **** significa que o que segue são as linhas 1 a 3 no primeiro arquivo, enquanto --- 1,3 ---- significa que o que segue é a linha 1 a 3 no segundo arquivo.

Um sinal de menos - na primeira coluna denota linhas que foram excluídas e um sinal de mais + marca linhas que foram adicionadas. Um ponto de exclamação marca as linhas que foram alteradas.

Se o seu caso, peach no primeiro arquivo foi alterado para strawberry no segundo.

    
por 24.11.2016 / 08:52
4

Sua pergunta é respondida no arquivo de informações do diff, nó Detailed Context :

The lines of context around the lines that differ start with two space characters. The lines that differ between the two files start with one of the following indicator characters, followed by a space character:

  • !

    A line that is part of a group of one or more lines that changed between the two files. There is a corresponding group of lines marked with ! in the part of this hunk for the other file.

  • +

    An "inserted" line in the second file that corresponds to nothing in the first file.

  • -

    A "deleted" line in the first file that corresponds to nothing in the second file.

O arquivo Info contém muitas informações sobre formatos de saída, incluindo linhas de cabeçalho. Eu recomendo que você leia de novo.

    
por 24.11.2016 / 13:14

Tags