coreutils c tail gnu-coreutils gnu-fileutils

gnu coreutils manual



Binario "cola" un archivo (7)

Esto no es cola, esto es copiar progresivamente un archivo. Mira rsync.

Supongo que la mayoría de las personas en este sitio están familiarizadas con la cola, si no, proporciona un modo "seguir" que a medida que el texto se agrega a la cola del archivo arrojará esos caracteres a la terminal.

Lo que estoy buscando (y posiblemente escribirme si es necesario) es una versión de cola que funciona en archivos binarios. Básicamente, tengo un enlace inalámbrico que me gustaría filtrar un archivo a medida que desciende desde otro enlace de red. Mirando el código fuente de la cola no sería muy difícil reescribir, ¡pero prefiero no reinventar la rueda! Esto no sería estrictamente "extremo", ya que me gustaría que se copiara todo el archivo, pero miraría a medida que se agregaran nuevos bytes y los transmitiera.

Ideas?


Tírela a hexdump:

tail -f somefile | hexdump -C


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 intermedio que probablemente desee evitar si desea recibir los nuevos datos "filtrados" tan pronto como sea posible.


Este script de Python codificado apresuradamente para Windows 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.")


También está la aplicación Bintail que parece ser más robusta que la secuencia de comandos antes mencionada.

El paquete Bintail contiene una sola aplicación, Bintail . El programa lee un archivo normal del disco y canaliza la salida a stdout, byte por byte, sin traducción, similar a lo que tail (1) hace a los archivos de texto. Esto es útil para "rastrear" archivos binarios, como archivos WAV, mientras se escriben en tiempo real. Esta aplicación es un trabajo en progreso, pero ya hace lo que fue diseñado para hacer por mí.


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, de modo que la salida no comience en algún lugar aleatorio en el medio de una estructura de datos. Puedes hacerlo simplemente comenzando al principio del archivo, que también es exactamente lo que pediste:

tail -c +1 -f somefile

funciona bien