Binario & # 8220; cola & # 8221; un archivo
-
04-07-2019 - |
Pregunta
Supongo que la mayoría de las personas en este sitio están familiarizadas con la cola, de lo contrario, proporciona un " seguir " El modo que a medida que el texto se agrega a la cola del archivo descargará esos caracteres en el terminal.
Lo que estoy buscando (y posiblemente escribirme si es necesario) es una versión de tail que funciona en archivos binarios. Básicamente, tengo un enlace inalámbrico al que me gustaría pasar un archivo a través de otro enlace de red. Mirar por encima del código fuente de la cola no sería demasiado difícil de reescribir, ¡pero preferiría no reinventar la rueda! Esto no sería estrictamente " cola " como me gustaría que se copiara el archivo completo, pero se vería a medida que se agregaran nuevos bytes y se transmitirían a esos.
Ideas?
Solución
También existe la aplicación bintail que parece ser más robusta que la secuencia de comandos mencionada anteriormente.
El paquete bintail contiene una sola aplicación, bintail . El programa lee un archivo normal del disco y canaliza la salida a la salida estándar, byte por byte, sin traducción, similar a lo que tail (1) hace a los archivos de texto. Esto es útil para " relaves " Archivos binarios, como los archivos WAV, mientras se escriben en tiempo real. Esta aplicación es un trabajo en progreso, pero ya hace lo que fue diseñada para mí.
Otros consejos
Llévalo a hexdump:
tail -f somefile | hexdump -C
Este script de Python para Windows, apresurado y codificado, puede ser de ayuda:
# 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
Luego presione shift F
Estrictamente hablando, necesita escribir un programa para hacer esto, ya que tail
no está especificado para trabajar en archivos binarios. También hay problemas de almacenamiento en búfer que probablemente desee evitar si desea recibir el nuevo " goteo " datos tan pronto como sea posible.
Linux coreutils tail (1) funciona bien en archivos binarios. Para la mayoría de las aplicaciones, solo necesita evitar su orientación de línea, para que la salida no comience en un lugar aleatorio en medio de una estructura de datos. Puede hacerlo simplemente comenzando al principio del archivo, que también es exactamente lo que pidió:
tail -c +1 -f somefile
funciona bien.
Esto no es una cola, esto está copiando progresivamente un archivo. Mira rsync.
También utilizo esto porque también funciona en transmisiones en vivo:
cat ./some_file_or_dev | hexdump -C
muestra descargando mis pulsaciones de teclas (y liberaciones):
[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