ثنائي "الذيل" ملف
-
04-07-2019 - |
سؤال
أعتقد أن معظم الأشخاص على هذا الموقع على دراية بالذيل، إذا لم يكن الأمر كذلك - فهو يوفر وضع "متابعة" حيث أنه عند إلحاق النص بذيل الملف، فإنه سيتم تفريغ تلك الأحرف إلى الوحدة الطرفية.
ما أبحث عنه (وربما أكتبه بنفسي إذا لزم الأمر) هو نسخة من الذيل تعمل على الملفات الثنائية.لدي في الأساس رابط لاسلكي أرغب في نقل الملف إليه عند نزوله من رابط شبكة آخر.بالنظر إلى الكود المصدري الخلفي، لن يكون من الصعب إعادة كتابته، لكنني أفضل عدم إعادة اختراع العجلة!لن يكون هذا بمثابة "ذيل" بشكل صارم لأنني أرغب في نسخ الملف بأكمله، ولكنه سيتم مشاهدته عند إضافة وحدات بايت جديدة ودفقها.
أفكار؟
المحلول
وهناك أيضا 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