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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top