2008-10-24 17 views
11

मुझे लगता है कि इस साइट पर अधिकांश लोग पूंछ से परिचित हैं, यदि नहीं - तो यह "अनुवर्ती" मोड प्रदान करता है क्योंकि फ़ाइल पूंछ में पाठ को जोड़ दिया जाता है, तो उन पात्रों को टर्मिनल पर डंप कर दिया जाएगा।द्विआधारी "पूंछ" एक फ़ाइल

जो मैं खोज रहा हूं (और संभवतः यदि आवश्यक हो तो खुद को लिखना) पूंछ का एक संस्करण है जो बाइनरी फाइलों पर काम करता है। असल में मेरे पास एक वायरलेस लिंक है जिसे मैं एक फ़ाइल को ट्रिकल करना चाहता हूं क्योंकि यह किसी अन्य नेटवर्क लिंक से नीचे आता है। पूंछ स्रोत कोड को देखते हुए इसे फिर से लिखना मुश्किल नहीं होगा, लेकिन मैं पहिया को फिर से नहीं बदलूंगा! यह सख्ती से "पूंछ" नहीं होगा क्योंकि मैं पूरी फाइल की प्रतिलिपि बनाना चाहता हूं, लेकिन यह देखेगा क्योंकि नए बाइट जोड़े गए थे और उनको स्ट्रीम करें।

विचार?

उत्तर

5

भी bintail आवेदन जो ऊपर उल्लिखित स्क्रिप्ट से अधिक मजबूत हो गया लगता है नहीं है।

bintail पैकेज एक भी आवेदन, bintail शामिल हैं। कार्यक्रम डिस्क से एक सामान्य फ़ाइल पढ़ता है, और आउटपुट को stdout, बाइट-बाय-बाइट, बिना अनुवाद के पाइप करता है, पूंछ (1) फ़ाइलों को पाठ करने के लिए करता है। यह "पूंछ" बाइनरी फ़ाइलों के लिए उपयोगी है, जैसे डब्ल्यूएवी फाइलें, जबकि वे रीयलटाइम में लिखे जा रहे हैं। यह ऐप प्रगति पर एक काम है, लेकिन यह पहले से ही करता है जो इसे मेरे लिए करने के लिए डिज़ाइन किया गया था।

+0

धन्यवाद, यह है मैं वास्तव में क्या जरूरत है, एक NodeJS धारा करने के लिए "tcpflow" से उत्पादन रीडायरेक्ट करने के लिए :) यह "पूंछ -f" के साथ काम नहीं किया। – Drasill

+1

लिनक्स binutils 'tail -c +1 -f somefile' में भी काम करता है। – ruief

12

पाइप यह hexdump रहे हैं:

tail -f somefile | hexdump -C 
+0

वाह मुझे नहीं लगता था कि – MattSmith

+0

काम करेगा मैं 100% स्वयं को सुनिश्चित नहीं करता था लेकिन मैंने कोशिश की और यह ठीक काम करता है। –

+1

बाइनरी फ़ाइल में एक नई लाइन देखने पर केवल नए डेटा को आउटपुट नहीं किया जाएगा? मुझे संदेह है कि यह अपने stdout unbuffers। – Chris

1

less somefile

फिर प्रेस shift F

+2

मैं छोड़ नहीं कैसे मैं एक फ़ाइल उत्पादन और प्रेस Shift + F पर रीडायरेक्ट करने कम इस्तेमाल कर सकते हैं देखें ... – Goyuix

0

यह न पूंछ है - इस उत्तरोत्तर पर फ़ाइल कॉपी है। Rsync पर देखो।

+0

मुझे आश्चर्य है कि यह है कि उत्तर स्वीकार्य है जहां दो उत्तर हैं जो अधिक प्रश्न से मेल खाते हैं: http://stackoverflow.com/a/6173419/1353930 http://stackoverflow.com/a/6171491/1353930। rsync यहां सहायक नहीं है क्योंकि यह डेटा स्ट्रीम नहीं कर सकता है। यह डिस्क –

+0

@Daniel Alder पर (अपेक्षाकृत स्थैतिक) फ़ाइलों तक ही सीमित है। आरएसआईएनसी को फिर से नया डेटा भेजकर फिर से चालू किया जा सकता है। – wnoise

+0

स्ट्रीमिंग का मतलब है कि आप 'netcat' आदि के लिए एक cgi स्क्रिप्ट रन और किनारी के अंदर हैं लेकिन वह अधिक @Goyuix –

1

कड़ाई से बोलने के लिए, आपको ऐसा करने के लिए एक प्रोग्राम लिखना होगा, क्योंकि tail बाइनरी फ़ाइलों पर काम करने के लिए निर्दिष्ट नहीं है। यदि आप जितनी जल्दी हो सके नए "ट्रिकलेड" डेटा प्राप्त करना चाहते हैं तो ऐसे बफरिंग मुद्दे भी हैं जिन्हें आप शायद टालना चाहते हैं।

+0

खैर पर एक सवाल की तलाश में फिर से मैंने देखा कि आपके द्वारा टैग की अपने प्रश्न gnu-coreutils था। तो यदि आप जानते हैं कि आप पूंछ के gnu कार्यान्वयन का उपयोग करेंगे, तो शायद यह बाइनरी सुरक्षित है और शायद समस्याग्रस्त बफरिंग नहीं है (जांचें और देखें)। –

2

विंडोज के लिए यह जल्दी से कोडित पायथॉन लिपि सहायता के हो सकते हैं:

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

लिनक्स कोर्यूटिल्स पूंछ (1) बाइनरी फ़ाइलों पर ठीक काम करता है। अधिकांश अनुप्रयोगों के लिए, आपको केवल अपनी लाइन-ओरिएंटेशन से बचने की आवश्यकता है, ताकि आउटपुट डेटा संरचना के मध्य में कुछ यादृच्छिक स्थान में शुरू न हो। आप ऐसा कर सकते हैं बस फ़ाइल की शुरुआत है, जो भी ठीक है आप के लिए क्या पूछा से शुरुआत करते हुए:

tail -c +1 -f somefile

काम करता है ठीक।

संबंधित मुद्दे