Respostas:
Supondo que você tenha o tamanho de file1
na variável FILE1_SZ
e sua head
implementação suporte 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
cmp
faz uma comparação simples de byte a byte e retorna assim que encontra uma diferença, enquanto diff
é um utilitário de texto que usa um algoritmo complexo para mostrar todas as diferenças entre os dois arquivos dos quais você não se importa.
Se o seu sistema possui o cmp
comando do GNU diffutils
, uma opção é
cmp -n 124665 file1 file2
comparar no máximo os primeiros 124665 bytes dos dois arquivos e relatar se eles diferem - ou, mais geralmente
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)
o tamanho em bytes? Será que wc
realmente abrir e processar todo o arquivo para obter a contagem de bytes?
wc
implementações otimizará esse caso e executará um fstat()
(ou / e a lseek(SEEK_END)
), portanto, será o mais eficiente possível. Por outro lado, isso stat -c
é específico do GNU.
cmp
, você possa razoavelmente assumir que ele é específico stat
.
O GNU cmp
pode resolver o problema de uma 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
: arquivo1 é um prefixo do arquivo2.
cmp: EOF on file2
: arquivo2 é um prefixo de arquivo1.
file1 file2 differ: byte NNN, line MMM
: Nem um prefixo do outro.
Infelizmente, isso é um pouco estranho de usar em um script, pois esses casos não parecem se distinguir no código de saída. Além disso, as EOF on file1
mensagens vão para stderr, enquanto as file1 file2 differ
mensagens vão para stdout.
Presumo que outras versões do cmp
façam algo semelhante, mas não verifiquei.
cmp
não é um comando exclusivo do GNU nem foi originado lá, ele já estava na primeira versão do Unix no início dos anos 70. A -n
opção é específica do GNU.
cmp file1 file2 2>&1 | grep EOF on file1
cmp
era exclusivo do GNU, apenas que o GNU cmp
era a única versão que eu tentei. Eu adicionei uma frase para esclarecer.
file1
e o outro é nomeado file12
. (Ou pior ainda, e se o segundo arquivo é chamado EOF on file1
?) Resolver este robustamente usando cmp
é provavelmente muito mais problemas do que escrever o programa 5-line óbvio em C ...
cmp
é tão fortemente restrita. Usar a -x
opção grep
para corresponder à linha inteira resolverá todos os casos, exceto os mais exóticos (por exemplo, novas linhas no nome do arquivo).
cmp
que seria melhor do quediff
aqui?