Como verificar se file1 é um prefixo de file2?

12

Eu tenho dois arquivos com tamanhos 124665 e 124858 em bytes e quero verificar se arquivo1 é um prefixo de arquivo2 ou não.

    
por tvorog 07.06.2014 / 17:42

3 respostas

11

Suponha que você tenha o tamanho de file1 na variável FILE1_SZ e sua head implementação suporta a opção (não padrão) -c :

if head -c "$FILE1_SZ" file2 | cmp -s - file1; then
    echo "file1 is a prefix of file2"
else
    echo "file1 is not a prefix of file2"
fi
    
por 07.06.2014 / 17:50
12

Se o seu sistema tiver o comando cmp do GNU diffutils , então uma opção é

cmp -n 124665 file1 file2

para comparar no máximo os primeiros 124665 bytes dos dois arquivos e informar se eles diferem - ou, mais geralmente

cmp -n "$(wc -c < file1)" file1 file2
    
por 07.06.2014 / 18:37
3

O GNU cmp pode resolver o problema de maneira mais fácil:

cmp file1 file2

Existem quatro saídas possíveis (exceto algum tipo de erro).

  • Sem saída: os arquivos são idênticos.

  • cmp: EOF on file1 : file1 é um prefixo do arquivo2.

  • cmp: EOF on file2 : o arquivo2 é um prefixo do arquivo1.

  • file1 file2 differ: byte NNN, line MMM : nenhum deles é um prefixo do outro.

Infelizmente, isso é um pouco complicado de usar em um script, já que esses casos não parecem ser diferenciados no código de saída. Além disso, as mensagens EOF on file1 vão para stderr, enquanto a mensagem file1 file2 differ vai para stdout.

Presumo que outras versões de cmp façam algo semelhante, mas não verifiquei.

    
por 07.06.2014 / 20:11