Respostas:
Supondo que você tenha o tamanho de file1na variável FILE1_SZe sua headimplementaçã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
cmpfaz 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 cmpcomando 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 wcrealmente abrir e processar todo o arquivo para obter a contagem de bytes?
wcimplementaçõ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 cmppode 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 file1mensagens vão para stderr, enquanto as file1 file2 differmensagens vão para stdout.
Presumo que outras versões do cmpfaçam algo semelhante, mas não verifiquei.
cmpnã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 -nopção é específica do GNU.
cmp file1 file2 2>&1 | grep EOF on file1
cmpera exclusivo do GNU, apenas que o GNU cmpera a única versão que eu tentei. Eu adicionei uma frase para esclarecer.
file1e 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 -xopção greppara corresponder à linha inteira resolverá todos os casos, exceto os mais exóticos (por exemplo, novas linhas no nome do arquivo).
cmpque seria melhor do quediffaqui?