2008-10-24 32 views
11

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 anexa al archivo cola arrojará esos caracteres al terminal.Binario "cola" un archivo

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 "falso", 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?

Respuesta

5

Existe también la aplicación bintail que parece ser más robusto que el guión antes mencionado.

El bintail paquete 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 hace tail (1) 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í.

+0

Gracias, es exactamente lo que necesitaba, para redirigir la salida de "tcpflow" a la corriente de nodejs :) No funcionó con "tail -f". – Drasill

+1

En linux binutils 'tail -c +1 -f somefile' funciona igual de bien. – ruief

12

de tuberías a Hexdump:

tail -f somefile | hexdump -C 
+0

wow No pensé que iba a funcionar – MattSmith

+0

Yo no estaba 100% seguro de mí mismo, pero lo probé y funciona muy bien. –

+1

¿No funcionaría tail -f solo la salida de datos nuevos cuando vio una nueva línea en el archivo binario? Dudo que libere su estándar. – Chris

1

less somefile

A continuación, pulse shift F

+2

No dejo de ver cómo podría usar menos para redirigir a una salida de archivo y presionar Shift + F ... – Goyuix

0

Esta no es la cola - esto es copiar un archivo de forma progresiva. Mira rsync.

+0

Me pregunto si esto la respuesta es la aceptada, donde hay dos respuestas que coinciden mucho más con la pregunta: http://stackoverflow.com/a/6173419/1353930 http://stackoverflow.com/a/6171491/1353930. rsync no es útil aquí porque no puede transmitir datos. está limitado a archivos (relativamente estáticos) en el disco –

+0

@Daniel Alder. rsync puede volver a ejecutarse, enviando solo los datos nuevos. – wnoise

+0

transmisión significa que estás dentro de una secuencia de comandos cgi o conectando a 'netcat', etc. Pero eso fue más una pregunta en @Goyuix –

1

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.

+0

Bueno, volviendo a mirar vi que etiquetaste tu pregunta gnu-coreutils. Entonces, si sabes que vas a utilizar la implementación gnu de la cola, probablemente sea binaria segura y probablemente no tenga un almacenamiento intermedio problemático (verifica y ve). –

2

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

Linux coreutils tail (1) funciona muy bien en archivos binarios. Para la mayoría de las aplicaciones, solo debe 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. Puede hacer que simplemente comenzar a principios del archivo, que también es exactamente lo que pidieron:

tail -c +1 -f somefile

funciona bien.

Cuestiones relacionadas