Comparando o conteúdo de dois arquivos

5

Eu tenho dois arquivos contendo uma lista de todos os caminhos de arquivos de dois discos rígidos (supostamente exatamente iguais), um dos quais eu acho que faltam arquivos. Ambas as listas têm o caminho e o tamanho do arquivo, mas as listas não estão na mesma ordem (veja o exemplo abaixo).

Existe um comando que pode comparar a diferença entre os dois arquivos e gerar a diferença para um novo arquivo?

Exemplo:

arquivo1:

/docs/red
/docs/blue
/docs/yellow
/docs/green

arquivo_2:

/docs/blue
/docs/green
/docs/red

Arquivo_de_diferença:

/docs/yellow
    
por impact_it 01.05.2018 / 06:30

5 respostas

8

Use grep e não é necessário classificá-los:

grep -Fxvf file2 file1 > diff_file

retornará linhas que estão em arquivo1 , mas não em arquivo2 (linhas perdidas em arquivo2 ).

    
por devWeek 01.05.2018 / 07:29
6

Eu tentaria usar o sort e diff:

$ diff <(sort csv1.txt) <(sort csv2.txt)
4d3
< 
8d6
< /docs/yellow
    
por user822833 01.05.2018 / 06:51
4

Eu geralmente uso o meld (que é uma ferramenta de comparação visual muito útil) para tais comparações.

Instalar o meld:

sudo apt-get install meld

Classifique e compare:

sort csv1.txt > csv1-sorted.txt
sort csv2.txt > csv2-sorted.txt
meld csv1-sorted.txt csv2-sorted.txt 
    
por Colin Ian King 01.05.2018 / 10:16
3

O comando comm foi projetado para responder a esse tipo de pergunta. O que ele faz é obter dois arquivos classificados como entrada e, em seguida, gerar três colunas de texto: linhas exclusivas para arquivo1, linhas exclusivas para arquivo2 e linhas comuns nos dois arquivos. Você pode suprimir qualquer uma dessas três colunas.

No seu caso, você gostaria de algo como:

comm <(sort file1) <(sort file_2) -3 --output-delimiter=''

O qual irá comparar file1 e file_2 e, em seguida, exibirá quaisquer diferenças existentes na saída padrão. Use -23 (suprima as colunas 2 e 3) se você quiser apenas as linhas exclusivas para file1 ou -13 (suprima as colunas 1 e 3) se desejar apenas as linhas exclusivas para file_2

    
por Tacroy 01.05.2018 / 17:17
1

Se a sua verdadeira questão é como comparar dois sistemas de arquivos montados, eu usaria rsync .

Veja: Rsync compara diretórios? no Unix & Linux

Você pode usar -n ( --dry-run ) para fazer com que nenhum arquivo seja realmente copiado e, em seguida, a saída são as diferenças. Isso, por padrão, também mostrará se um arquivo é mais novo que outro, ou seja, se o conteúdo foi alterado. Estou bastante confiante de que pode ser configurado para ignorar o conteúdo do arquivo.

    
por Zak 01.05.2018 / 23:38