Eu gostaria de testar meu programa de hash invertendo um único byte no final de um arquivo sem modificar o carimbo de data/hora. Evitar que o timestamp mude é bastante fácil, mas como uso um utilitário unix para inverter o último byte do arquivo?
Por exemplo: xou o último byte com 0xFF (uma operação que é facilmente reversível)
Não sed, mas isso parece funcionar em Perl:
Ele lê por linhas, mas isso não importa, pois é limpo de 8 bits.
eof
é true na última linha e\z
corresponde ao final bruto da string ($
também corresponderia antes de uma nova linha final opcional, portanto, não estritamente no último byte). A substituição é apenas a operação xor na string correspondente.Eu mesmo fiz isso em python:
Não é a solução mais elegante, mas tenho certeza de que vocês têm algum truque engenhoso de sed e podem fazê-lo melhor.
Aqui está a versão completa, você pode executar com ./invert.py (nome do arquivo)
Ferramentas como
sed
eawk
geralmente não são adequadas para buscar arquivos ou manipular o conteúdo de um arquivo no nível de byte. Eles são orientados por linha, querem regexps ou números de linha como endereços e não têm nenhuma maneira (embutida) de recuperar os metadados de um arquivo, como, por exemplo, seu tamanho ou carimbos de data e hora.É possível alcançar o resultado pretendido também por meio de ferramentas de linha de comando, mas, até onde posso conceber, você precisa executar operações de "cola" em qualquer caso.
Aqui está minha tentativa, apenas por diversão: ( em uma única linha apenas para demonstração, conforme seu desejo )
Substitua
<file>
pelo nome do seu arquivo.Não é realmente um one-liner, como você pode ver. Eu fui até certo ponto para ser compatível com POSIX, mas mesmo sem isso não seria muito mais curto.
Observe também que ele não cuida do carimbo de data/hora do arquivo. Para fazer isso com ferramentas de linha de comando, ficaria assim: ( desta vez dividido para legibilidade e explicação )
Usando
touch -r
para frente e para trás em um arquivo temporário porque essa deve ser a maneira mais portátil de manter a precisão de nanossegundos.Pode ser bom observar também a necessidade de executar a operação arriscada de analisar
ls
a saída, mas não consigo pensar em outra ferramenta POSIX para recuperar o tamanho de um arquivo. Claro que neste caso poderia ser feito de uma forma mais segura (complicando ainda mais o script), mas essa necessidade pode ser mais uma dica de que estamos estendendo as ferramentas padrão um pouco além de suas tarefas pretendidas.