Двоичный «хвостовой» файл - PullRequest
11 голосов
/ 24 октября 2008

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

То, что я ищу (и, возможно, напишу сам при необходимости), является версией tail, которая работает с двоичными файлами. По сути, у меня есть беспроводная связь, по которой я хотел бы перетаскивать файл, поскольку он исходит от другой сетевой ссылки. Просматривая исходный код, переписать его будет не сложно, но я бы не стал изобретать велосипед! Строго говоря, это не будет «хвост», поскольку я хотел бы, чтобы весь файл копировался, но он будет наблюдать за добавлением новых байтов и их потоковую передачу.

Идеи? * * 1005

Ответы [ 8 ]

14 голосов
/ 24 октября 2008

Отправьте это в hexdump:

tail -f somefile | hexdump -C
5 голосов
/ 30 мая 2011

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

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

2 голосов
/ 30 мая 2011

Этот наскоро написанный скрипт Python для 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.")
1 голос
/ 25 июля 2017

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

tail -c +1 -f somefile

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

1 голос
/ 04 октября 2010

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

1 голос
/ 24 октября 2008

less somefile

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

0 голосов
/ 20 марта 2018

Я использую это, так как оно работает и в прямом эфире:

cat ./some_file_or_dev | hexdump -C

пример сброса моих нажатий клавиш (и выпусков):

[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
0 голосов
/ 24 октября 2008

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

...