Binario & # 8220; coda & # 8221; un file
-
04-07-2019 - |
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?
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