سؤال

أعتقد أن معظم الأشخاص على هذا الموقع على دراية بالذيل، إذا لم يكن الأمر كذلك - فهو يوفر وضع "متابعة" حيث أنه عند إلحاق النص بذيل الملف، فإنه سيتم تفريغ تلك الأحرف إلى الوحدة الطرفية.

ما أبحث عنه (وربما أكتبه بنفسي إذا لزم الأمر) هو نسخة من الذيل تعمل على الملفات الثنائية.لدي في الأساس رابط لاسلكي أرغب في نقل الملف إليه عند نزوله من رابط شبكة آخر.بالنظر إلى الكود المصدري الخلفي، لن يكون من الصعب إعادة كتابته، لكنني أفضل عدم إعادة اختراع العجلة!لن يكون هذا بمثابة "ذيل" بشكل صارم لأنني أرغب في نسخ الملف بأكمله، ولكنه سيتم مشاهدته عند إضافة وحدات بايت جديدة ودفقها.

أفكار؟

هل كانت مفيدة؟

المحلول

وهناك أيضا com.bintail التطبيق الذي يبدو أنه أقوى من البرنامج النصي المذكور أعلاه.

ال com.bintail تحتوي الحزمة على تطبيق واحد، com.bintail.يقرأ البرنامج ملفًا عاديًا من القرص، وينقل الإخراج إلى stdout، بايت بايت، بدون ترجمة، على غرار ما ذيل(1) يفعل للملفات النصية.يعد هذا مفيدًا لتتبع الملفات الثنائية، مثل ملفات WAV، أثناء كتابتها في الوقت الفعلي.هذا التطبيق قيد التقدم، ولكنه يفعل بالفعل ما تم تصميمه من أجله.

نصائح أخرى

والأنابيب لhexdump:

tail -f somefile | hexdump -C

وهذا السيناريو بيثون مشفرة على عجل ل Windows قد يكون من المساعدة:

# 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

وثم اضغط shift F

وبالمعنى الدقيق للكلمة، تحتاج إلى كتابة برنامج للقيام بذلك، كما لم يتم تحديد tail للعمل على الملفات الثنائية. هناك أيضا قضايا التخزين المؤقت ربما كنت ترغب في تجنب إذا كنت ترغب في الحصول على الجديد "تدفقت" البيانات في أقرب وقت ممكن.

ولينكس coreutils الذيل (1) يعمل على ما يرام على الملفات الثنائية. بالنسبة لمعظم التطبيقات، تحتاج فقط إلى تجنب التوجه نحو خط، بحيث لا يبدأ الانتاج في بعض نقطة عشوائية في منتصف بنية بيانات. يمكنك القيام بذلك ببساطة عن طريق بدءا من بداية الملف، والذي هو أيضا بالضبط ما طلبتم:

وtail -c +1 -f somefile

ويعمل على ما يرام.

وهذا ليس الذيل - وهذا هو نسخ ملف تدريجيا. انظروا رسينك.

أستخدم هذا لأنه يعمل على البث المباشر أيضًا:

cat ./some_file_or_dev | hexdump -C

عينة من تفريغ مكابس المفاتيح (والإصدارات):

[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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top