15

このサイトのほとんどの人は、そうでない場合でも、tail に精通していると思います。テキストがファイル tail に追加されると、それらの文字を端末にダンプする「フォロー」モードを提供します。

私が探しているのは (必要に応じて自分自身を書くこともあるかもしれません)、バイナリ ファイルで動作するバージョンの tail です。基本的に、別のネットワーク リンクからファイルが送信されてきたときに、そのファイルを少しずつ転送したいワイヤレス リンクがあります。tail のソース コードを調べてみると、書き直すのはそれほど難しくありませんが、車輪の再発明はしたくありません。ファイル全体をコピーしたいので、これは厳密には「テール」ではありませんが、新しいバイトが追加され、それらをストリーミングするのを監視します。

アイデア?

4

9 に答える 9

20

それを hexdump にパイプします。

tail -f somefile | hexdump -C
于 2008-10-24T01:39:05.187 に答える
6

前述のスクリプトよりも堅牢なbintailアプリケーションもあります。

bintailパッケージには単一のアプリケーションbintailが含まれていますプログラムはディスクから通常のファイルを読み取り、テキスト ファイルに対するtail (1)と同様に、出力を変換せずにバイト単位で stdout にパイプします。これは、WAV ファイルなどのバイナリ ファイルをリアルタイムで書き込んでいるときに、そのファイルを "テーリング" するのに役立ちます。このアプリは開発中ですが、私のために設計された機能は既に実行されています。

于 2011-05-30T07:29:30.410 に答える
2

Windows 用に急いでコード化された次の Python スクリプトが役立つ場合があります。

# 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.")
于 2011-05-30T01:12:36.030 に答える
1

厳密に言えば、tailバイナリファイルで動作するように指定されていないため、これを行うためのプログラムを作成する必要があります。新しい「だまされた」データをできるだけ早く受け取りたい場合は、おそらく避けたいバッファリングの問題もあります。

于 2010-10-04T17:17:00.543 に答える
1

less somefile

次に押すshift F

于 2008-10-24T01:44:10.887 に答える
0

これはテールではありません。これはファイルを段階的にコピーしています。rsync を見てください。

于 2008-10-24T02:15:56.907 に答える