Двоичный "хвост" файла

Я бы предположил, что большинство людей на этом сайте знакомы с хвостом, если нет - он предоставляет режим "follow", который по мере добавления текста к хвосту файла выведет эти символы на терминал.

То, что я ищу (и, возможно, написать, если нужно), представляет собой версию хвоста, которая работает в двоичных файлах. В принципе, у меня есть беспроводная связь, которую я бы хотел просочиться в файл, поскольку он сходит с другой сетевой ссылки. Оглядываясь на исходный код хвоста, было бы не слишком сложно переписать, но я бы предпочел не изобретать колесо! Это не будет строго "хвостом", так как я бы хотел, чтобы весь файл был скопирован, но он будет наблюдать за добавлением новых байтов и потоком их.

Идеи?

Ответ 1

Существует также приложение bintail, которое выглядит более надежным, чем вышеупомянутое script.

Пакет bintail содержит одно приложение bintail. Программа считывает нормальный файл с диска и транслирует вывод в stdout побайтно, без перевода, аналогично тому, как tail (1) выполняет в текстовые файлы. Это полезно для "хвоста" двоичных файлов, таких как WAV файлы, когда они записываются в реальном времени. Это приложение работает, но оно уже делает то, что оно предназначено для меня.

Ответ 2

Подключите его к hexdump:

tail -f somefile | hexdump -C

Ответ 3

Этот запрограммированный Python script для Windows может помочь:

# 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.")

Ответ 4

less somefile

Затем нажмите shift F

Ответ 5

Строго говоря, вам нужно написать программу для этого, поскольку tail не указывается для работы с двоичными файлами. Будут также проблемы с буферизацией, которые вы, вероятно, захотите избежать, если вы хотите как можно скорее получить новые "просочившиеся" данные.

Ответ 6

Linux coreutils tail (1) отлично работает в двоичных файлах. Для большинства приложений вам просто нужно избегать его линейной ориентации, чтобы выход не начинался в некотором случайном месте в середине структуры данных. Вы можете сделать это, просто начиная с начала файла, что также точно то, о чем вы просили:

tail -c +1 -f somefile

отлично работает.

Ответ 7

Это не хвост - это постепенное копирование файла. Посмотрите на rsync.