Question

Je suppose que la plupart des gens sur ce site connaissent bien la queue, sinon - cela fournit un "suivre". Le mode qui, au fur et à mesure que le texte est ajouté au fichier, redirige ces caractères vers le terminal.

Ce que je recherche (et éventuellement si j’écris moi-même) est une version de tail qui fonctionne sur les fichiers binaires. En gros, j’ai un lien sans fil sur lequel j’aimerais glisser un fichier au fur et à mesure qu’il descend d’un autre lien réseau. En examinant le code source de la queue, il ne serait pas trop difficile de le réécrire, mais je préférerais ne pas réinventer la roue! Cela ne serait pas strictement "queue". comme je voudrais que tout le fichier soit copié, mais il regarderait comme de nouveaux octets ont été ajoutés et les diffuser.

Des idées?

Était-ce utile?

La solution

Il existe également l'application bintail qui semble être plus robuste que le script susmentionné.

  

Le package bintail contient une seule application, bintail . Le programme lit un fichier normal à partir du disque et dirige la sortie sur stdout, octet par octet, sans traduction, comme le fait tail (1) dans les fichiers texte. Ceci est utile pour " tailing " fichiers binaires, tels que les fichiers WAV, en cours d’écriture en temps réel. Cette application est un travail en cours, mais elle fait déjà ce pour quoi elle a été conçue.

Autres conseils

Ajoutez un tuyau à hexdump:

tail -f somefile | hexdump -C

Ce script Python codé à la hâte pour Windows peut vous être utile:

# 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.")

moins du fichier

Appuyez ensuite sur shift F

À proprement parler, vous devez écrire un programme pour cela, car tail n'est pas spécifié pour fonctionner sur des fichiers binaires. Il existe également des problèmes de mise en mémoire tampon que vous voudrez probablement éviter si vous souhaitez recevoir le nouveau " goutte à goutte & données dès que possible.

Linux coreutils tail (1) fonctionne très bien sur les fichiers binaires. Pour la plupart des applications, il suffit d’éviter l’orientation des lignes afin que la sortie ne commence pas à un endroit aléatoire au milieu d’une structure de données. Vous pouvez le faire en commençant simplement au début du fichier, ce qui correspond également à ce que vous avez demandé:

tail -c +1 -f un fichier

fonctionne très bien.

Ce n’est pas la fin, c’est la copie progressive d’un fichier. Regardez rsync.

J'utilise ceci car il fonctionne aussi sur les flux en direct:

cat ./some_file_or_dev | hexdump -C

exemple vidant mes touches (et communiqués):

[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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top