Eu tenho dois arquivos com tamanhos 124665 e 124858 em bytes e quero verificar se file1 é um prefixo de file2 ou não.
files
file-comparison
tvorog
fonte
fonte
cmp
que seria melhor do quediff
aqui?cmp
faz uma comparação simples de byte a byte e retorna assim que encontra uma diferença, enquantodiff
é 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 GNUdiffutils
, uma opção écomparar no máximo os primeiros 124665 bytes dos dois arquivos e relatar se eles diferem - ou, mais geralmente
fonte
$(stat -c %s file1)
o tamanho em bytes? Será quewc
realmente abrir e processar todo o arquivo para obter a contagem de bytes?wc
implementações otimizará esse caso e executará umfstat()
(ou / e alseek(SEEK_END)
), portanto, será o mais eficiente possível. Por outro lado, issostat -c
é específico do GNU.cmp
, você possa razoavelmente assumir que ele é específicostat
.O GNU
cmp
pode resolver o problema de uma maneira mais fácil: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 asfile1 file2 differ
mensagens vão para stdout.Presumo que outras versões do
cmp
façam algo semelhante, mas não verifiquei.fonte
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 GNUcmp
era a única versão que eu tentei. Eu adicionei uma frase para esclarecer.file1
e o outro é nomeadofile12
. (Ou pior ainda, e se o segundo arquivo é chamadoEOF on file1
?) Resolver este robustamente usandocmp
é provavelmente muito mais problemas do que escrever o programa 5-line óbvio em C ...cmp
é tão fortemente restrita. Usar a-x
opçãogrep
para corresponder à linha inteira resolverá todos os casos, exceto os mais exóticos (por exemplo, novas linhas no nome do arquivo).