यह है कि आप यह कैसे कर सकते हैं:
i=$(((t=19876543212)-(h=12345678901)))
{ dd count=0 skip=1 bs="$h"
dd count="$((i/(b=64*1024)-1))" bs="$b"
dd count=1 bs="$((i%b))"
} <infile >outfile
यह सब वास्तव में आवश्यक है - इसे और अधिक की आवश्यकता नहीं है। पहली जगह में नियमित रूप से तुरंत इनपुट पर नियमित रूप से फ़ाइल इनपुट खत्म dd count=0 skip=1 bs=$block_size1
हो जाएगा lseek()
। मिस्ड डेटा का कोई मौका नहीं है या इसके बारे में जो कुछ भी असत्य बताया गया है, आप बस सीधे अपनी वांछित शुरुआत की तलाश कर सकते हैं। चूँकि फ़ाइल डिस्क्रिप्टर शेल के स्वामित्व में है और dd
केवल इसे प्राप्त कर रहे हैं, वे इसकी कर्सर स्थिति को प्रभावित करेंगे और इसलिए आप इसे केवल चरणों में ले सकते हैं। यह वास्तव में बहुत सरल है - और कार्य से बेहतर कोई मानक उपकरण नहीं है dd
।
यह एक 64k ब्लॉक का उपयोग करता है जो अक्सर आदर्श होता है। आम धारणा के विपरीत, बड़े अवरोधक dd
काम को तेज नहीं बनाते हैं। दूसरी ओर, छोटे बफ़र्स भी अच्छे नहीं हैं। dd
सिस्टम कॉल में अपने समय को सिंक्रनाइज़ करने की आवश्यकता है ताकि इसे मेमोरी में डेटा कॉपी करने और फिर से आउट करने की प्रतीक्षा न करें, बल्कि यह भी कि सिस्टम कॉल पर प्रतीक्षा करने की आवश्यकता न हो। इसलिए आप चाहते हैं कि यह पर्याप्त समय ले कि अगले read()
को आखिरी इंतजार न करना पड़े, लेकिन इतना भी नहीं कि आप बड़े आकार में बफ़र कर रहे हों।
तो पहले dd
स्थिति शुरू करने के लिए रुक जाती है। जिसमें शून्य समय लगता है । आप उस बिंदु पर पसंद किए गए किसी अन्य कार्यक्रम को उसके स्टड को पढ़ने के लिए कह सकते हैं और यह सीधे आपके वांछित बाइट ऑफसेट पर पढ़ना शुरू कर देगा। मैं एक और कॉल dd
करने के ((interval / blocksize) -1)
लिए स्टडआउट के लिए गिनती ब्लॉक पढ़ता हूं ।
आखिरी चीज जो आवश्यक है वह पिछले डिवीजन ऑपरेशन के मापांक (यदि कोई हो) की नकल करना है। और वही जो है।
इस पर विश्वास मत करो, वैसे, जब लोग सबूत के बिना अपने चेहरे पर तथ्यों को राज्य करते हैं। हां, dd
एक छोटी रीड करना संभव है (हालांकि स्वस्थ ब्लॉक डिवाइस से इस तरह की चीजें संभव नहीं हैं - इस प्रकार नाम) । ऐसी चीजें केवल तभी संभव हैं जब आप एक dd
धारा को सही ढंग से बफर नहीं करते हैं जो एक ब्लॉक डिवाइस के अलावा अन्य से पढ़ी जाती है। उदाहरण के लिए:
cat data | dd bs="$num" ### incorrect
cat data | dd ibs="$PIPE_MAX" obs="$buf_size" ### correct
दोनों मामलों में सभी डेटा की dd
प्रतिलिपि बनाता है । पहले मामले में यह संभव है (हालांकि साथ की संभावना नहीं ) है कि उत्पादन ब्लॉक जिनमें से कुछ थोड़ा बाहर इच्छा प्रतियां बराबर "$ संख्या" बाइट्स क्योंकि spec'd है केवल सब पर कुछ भी बफ़र होना जब बफर विशेष रूप से अपनी कमान पर अनुरोध किया जाता है लाइन। एक का प्रतिनिधित्व करता है अधिकतम ब्लॉक आकार क्योंकि उद्देश्य के वास्तविक समय मैं / हे है।cat
dd
dd
bs=
dd
दूसरे उदाहरण में, मैं स्पष्ट रूप से आउटपुट को निर्दिष्ट करता हूं और dd
बफ़र तब तक पढ़ता है जब तक कि पूर्ण लेखन नहीं किया जा सकता है। यह प्रभावित नहीं करता है count=
जो इनपुट ब्लॉक पर आधारित है, लेकिन इसके लिए आपको बस एक और की आवश्यकता है dd
। कोई गलत सूचना जो आपको दी गई है अन्यथा अवहेलना की जानी चाहिए।
bs=1M iflag=skip_bytes,count_bytes