Двоичный «хвост» файла
-
04-07-2019 - |
Вопрос
Я предполагаю, что большинство людей на этом сайте знакомы с хвостом, если нет - он обеспечивает режим «следования», в котором при добавлении текста к хвосту файла эти символы выгружаются на терминал.
То, что я ищу (и, возможно, напишу сам, если необходимо), — это версия хвоста, которая работает с двоичными файлами.По сути, у меня есть беспроводное соединение, по которому я хотел бы передать файл, когда он поступает из другого сетевого канала.Просматривая исходный код хвоста, его не составит большого труда переписать, но я бы не хотел изобретать велосипед!Это не будет строго «хвост», поскольку я хотел бы скопировать весь файл, но он будет отслеживать добавление новых байтов и передавать их в потоковом режиме.
Идеи?
Решение
Существует также бихвост приложение, которое кажется более надежным, чем вышеупомянутый скрипт.
А бихвост пакет содержит одно приложение, бихвост.Программа считывает обычный файл с диска и передает вывод на стандартный вывод побайтно, без перевода, аналогично тому, что хвост(1) относится к текстовым файлам.Это полезно для отслеживания двоичных файлов, таких как файлы WAV, пока они записываются в реальном времени.Это приложение находится в стадии разработки, но оно уже делает то, для чего было создано для меня.
Другие советы
Перенесите это в hexdump:
tail -f somefile | hexdump -C
Этот наспех написанный скрипт 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.")
less somefile
Затем нажмите shift F
Строго говоря, для этого нужно написать программу, т.к. tail
не указан для работы с двоичными файлами.Существуют также проблемы с буферизацией, которых, вероятно, следует избегать, если вы хотите как можно скорее получить новые «поступившие» данные.
Linux coreutils Tail(1) прекрасно работает с двоичными файлами.Для большинства приложений вам просто нужно избегать его линейной ориентации, чтобы вывод не начинался в каком-то случайном месте в середине структуры данных.Вы можете сделать это, просто начав с начала файла, и это именно то, что вы просили:
tail -c +1 -f somefile
работает просто отлично.
Это не хвост — это постепенное копирование файла.Посмотрите на рсинк.
Я использую это, поскольку оно работает и в прямых трансляциях:
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