Binary “cauda” de um arquivo
-
04-07-2019 - |
Pergunta
Eu acho que a maioria das pessoas neste site estão familiarizados com a cauda, ??se não -. Ele fornece uma "seguir" o modo que à medida que o texto é anexado à cauda ficheiro vai despejar esses personagens para o terminal
O que eu estou procurando (e possivelmente para escrever-me se necessário) é uma versão de cauda que funciona em arquivos binários. Basicamente, eu tenho uma ligação sem fios que eu gostaria de pingar um arquivo em como ele vem para baixo de outra ligação de rede. Olhando sobre o código fonte de cauda que não seria muito difícil para reescrever, mas prefiro não reinventar a roda! Isso não seria estritamente "cauda" como eu gostaria todo o arquivo a ser copiado, mas seria ver como foram adicionados novos bytes e transmitir os.
Idéias?
Solução
Há também a href="http://kk5jy.net/bintail/" rel="noreferrer"> bintail aplicação que parece ser mais robusto do que o script acima mencionado.
O bintail pacote contém uma única aplicação, bintail . O programa lê um arquivo normal do disco, e envia a saída para stdout, byte a byte, sem tradução, semelhante ao que cauda (1) faz para arquivos de texto. Isso é útil para "rejeitos" arquivos binários, tais como arquivos WAV, enquanto eles estão sendo escritas em tempo real. Este aplicativo é um trabalho em andamento, mas já faz o que foi projetado para fazer para mim.
Outras dicas
canalizá-lo para hexdump:
tail -f somefile | hexdump -C
Este script Python apressadamente codificado para Windows pode ser de ajuda:
# bintail.py -- reads a binary file, writes initial contents to stdout,
# and writes new data to stdout as it is appended to the file.
import time
import sys
import os
import msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
# Time to sleep between file polling (seconds)
sleep_int = 1
def main():
# File is the first argument given to the script (bintail.py file)
binfile = sys.argv[1]
# Get the initial size of file
fsize = os.stat(binfile).st_size
# Read entire binary file
h_file = open(binfile, 'rb')
h_bytes = h_file.read(128)
while h_bytes:
sys.stdout.write(h_bytes)
h_bytes = h_file.read(128)
h_file.close()
# Loop forever, checking for new content and writing new content to stdout
while 1:
current_fsize = os.stat(binfile).st_size
if current_fsize > fsize:
h_file = open(binfile, 'rb')
h_file.seek(fsize)
h_bytes = h_file.read(128)
while h_bytes:
sys.stdout.write(h_bytes)
h_bytes = h_file.read(128)
h_file.close()
fsize = current_fsize
time.sleep(sleep_int)
if __name__ == '__main__':
if len(sys.argv) == 2:
main()
else:
sys.stdout.write("No file specified.")
less somefile
Depois de imprensa shift F
Estritamente falando, você precisa escrever um programa para fazer isso, como tail
não é especificado para trabalhar em arquivos binários. Há também tamponamento questões que você provavelmente vai querer evitar se você quiser receber o novo "escorria" dados o mais rápido possível.
cauda Linux coreutils (1) funciona muito bem em arquivos binários. Para a maioria das aplicações, você só precisa evitar a sua linha de orientação, de modo que a saída não começar em algum lugar aleatório no meio de uma estrutura de dados. Você pode fazer isso simplesmente começando no início do arquivo, que também é exatamente o que você pediu:
tail -c +1 -f somefile
funciona muito bem.
Este não é cauda - isto é copiar progressivamente um arquivo. Olhada rsync.
Eu uso isso como ele funciona em transmissões ao vivo demasiado:
cat ./some_file_or_dev | hexdump -C
Exemplo de despejo minhas teclas pressionadas (e versões):
[user@localhost input]$ sudo cat /dev/input/event2 | hexdump -C
00000000 81 32 b1 5a 00 00 00 00 e2 13 02 00 00 00 00 00 |.2.Z............|
00000010 04 00 04 00 36 00 00 00 81 32 b1 5a 00 00 00 00 |....6....2.Z....|
00000020 e2 13 02 00 00 00 00 00 01 00 36 00 01 00 00 00 |..........6.....|
00000030 81 32 b1 5a 00 00 00 00 e2 13 02 00 00 00 00 00 |.2.Z............|
00000040 00 00 00 00 00 00 00 00 81 32 b1 5a 00 00 00 00 |.........2.Z....|
00000050 a3 af 02 00 00 00 00 00 04 00 04 00 36 00 00 00 |............6...|
00000060 81 32 b1 5a 00 00 00 00 a3 af 02 00 00 00 00 00 |.2.Z............|
^C