Domanda

Immagino che la maggior parte delle persone su questo sito abbia familiarità con tail, in caso contrario - fornisce un "follow " modalità che, man mano che il testo viene aggiunto alla coda del file, scaricherà quei caratteri sul terminale.

Quello che sto cercando (e possibilmente scrivermi se necessario) è una versione di coda che funziona su file binari. Fondamentalmente ho un collegamento wireless che vorrei far scorrere un file mentre scende da un altro collegamento di rete. Guardando il codice sorgente della coda non sarebbe difficile riscrivere, ma preferirei non reinventare la ruota! Questo non sarebbe rigorosamente "coda" come vorrei che l'intero file venisse copiato, ma avrebbe guardato mentre venivano aggiunti nuovi byte e li scorreva in streaming.

idee?

È stato utile?

Soluzione

Esiste anche l'applicazione bintail che sembra essere più robusta della suddetta sceneggiatura.

  

Il pacchetto bintail contiene una singola applicazione, bintail . Il programma legge un normale file dal disco e reindirizza l'output allo stdout, byte per byte, senza traduzione, simile a quello che coda (1) fa ai file di testo. Questo è utile per " tailing " file binari, come i file WAV, mentre vengono scritti in tempo reale. Questa app è in fase di elaborazione, ma fa già quello per cui è stata progettata per me.

Altri suggerimenti

Pipe it to hexdump:

tail -f somefile | hexdump -C

Questo script Python codificato in fretta per Windows può essere di aiuto:

# 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

Quindi premere shift F

A rigor di termini, è necessario scrivere un programma per farlo, poiché tail non è specificato per funzionare su file binari. Ci sono anche problemi di buffering che probabilmente vorrai evitare se desideri ricevere il nuovo "quotato" dati al più presto.

Linux coreutils tail (1) funziona perfettamente sui file binari. Per la maggior parte delle applicazioni, è sufficiente evitare l'orientamento della linea, in modo che l'output non inizi in un punto casuale nel mezzo di una struttura di dati. Puoi farlo semplicemente iniziando all'inizio del file, che è anche esattamente quello che hai chiesto:

tail -c +1 -f somefile

funziona perfettamente.

Questa non è coda, ma sta progressivamente copiando un file. Guarda rsync.

Lo uso come funziona anche su streaming live:

cat ./some_file_or_dev | hexdump -C

campione che scarica i miei tasti premuti (e rilasci):

[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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top