Binary „Schwanz“ eine Datei
-
04-07-2019 - |
Frage
würde ich die meisten Menschen auf dieser Seite erraten sind vertraut mit Schwanz, wenn nicht -. Eine „folgen“ Modus liefert, die als Text in die Datei Schwanz angehängt wird, werden diese Zeichen, um das Terminal-Dump
Was ich suche (und möglicherweise selbst wenn notwendig zu schreiben) ist eine Version des Schwanzes, der auf Binär-Dateien arbeitet. Im Prinzip habe ich eine drahtlose Verbindung, die Ich mag würde, eine Datei rieseln über, wie es nach unten von einer anderen Netzwerkverbindung kommt. Mit Blick auf den Quellcode Schwanz wäre es nicht allzu schwer zu umschreiben, aber ich würde lieber das Rad nicht neu erfinden! Dies wäre nicht streng sein „Schwanz“, wie ich die gesamte Datei kopiert werden möchte, aber es würde zusehen, wie neue Bytes wurden hinzugefügt und diejenigen streamen.
Ideen?
Lösung
Es gibt auch die bintail Anwendung, die robuster zu sein scheint als die zuvor erwähnte Skript.
Das bintail Paket enthält eine einzelne Anwendung, bintail . Das Programm liest eine normale Datei von der Festplatte und Rohren der Ausgabe auf stdout, Byte-für-Byte, ohne Übersetzung, ähnlich wie Schwanz (1) hat in Textdateien. Dies ist nützlich für „Tailing“ binäre Dateien wie WAV-Dateien, während sie in Echtzeit geschrieben werden. Diese App ist ein work in progress, aber es hat schon, was es für mich zu tun entworfen.
Andere Tipps
Rohr es HexDump:
tail -f somefile | hexdump -C
Dieses hastig codiert Python-Skript für Windows kann hilfreich sein:
# 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
Dann drücken shift F
Genau genommen müssen Sie ein Programm schreiben, dies zu tun, als tail
nicht angegeben ist auf binäre Dateien zu arbeiten. Es gibt Pufferung Probleme auch möchten Sie wahrscheinlich vermeiden, wenn Sie die neue erhalten möchten „getröpfelt“ Daten so schnell wie möglich.
Linux coreutils Schwanz (1) arbeitet auf Binär-Dateien in Ordnung. Für die meisten Anwendungen müssen Sie nur seine Line-Ausrichtung zu vermeiden, so dass die Ausgabe nicht in einem zufälligen Punkt in der Mitte einer Datenstruktur beginnen. Sie können das tun, indem Sie einfach am Anfang der Datei beginnen, die auch genau das, was Sie gefragt:
tail -c +1 -f somefile
funktioniert gut.
Dies ist kein Schwanz - das schrittweise eine Datei kopiert. Schauen Sie sich rsync.
Ich benutze dies, wie es bei Live-Streams funktioniert auch:
cat ./some_file_or_dev | hexdump -C
Proben Dumping meine Tastendrücke (und gibt):
[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