से कल्पना :
- तो
bs=exprसंकार्य निर्दिष्ट किया जाता है और बिना किसी रूपांतरण के अलावा अन्य sync, noerrorया notruncअनुरोध कर रहे हैं, डेटा प्रत्येक इनपुट ब्लॉक से लौटे एक अलग उत्पादन ब्लॉक के रूप में लिखा जाएगा; यदि read()पूर्ण ब्लॉक और syncरूपांतरण से कम रिटर्न निर्दिष्ट नहीं है, तो परिणामी आउटपुट ब्लॉक इनपुट ब्लॉक के समान आकार का होगा।
तो शायद यही आपके भ्रम का कारण बनता है। हाँ, क्योंकि ddहै डिज़ाइन किया गया अवरुद्ध, डिफ़ॉल्ट रूप से आंशिक के लिए read()आंशिक करने के लिए 1: रों 1 मैप किया जाएगा write()रों, वरना syncकरने पर पूंछ गद्दी NUL या अंतरिक्ष वर्ण बाहर d bs=जब आकार conv=syncनिर्दिष्ट किया जाता है।
इसका मतलब है कि ddहै (w / भ्रष्टाचार का कोई खतरा नहीं एक आंशिक पढ़ने या लिखने की वजह से) नकल डेटा के लिए उपयोग करने के लिए सुरक्षित हर मामले में, लेकिन एक है जिसमें यह मनमाने ढंग से एक द्वारा सीमित है count=तर्क, क्योंकि अन्यथा ddहोगा खुशी से write()हूबहू आकार ब्लॉकों में इसके उत्पादन उन लोगों के लिए जिसमें इसका इनपुट तब read()तक था जब तक कि यह read()पूरी तरह से इसके माध्यम से न हो। और यहां तक कि इस चेतावनी है ही सच्चा जब bs=निर्दिष्ट किया जाता है या obs=है नहीं निर्दिष्ट, कल्पना राज्यों में अगले ही वाक्य के रूप में:
- तो
bs=exprसंकार्य निर्दिष्ट नहीं है, या एक रूपांतरण के अलावा अन्य sync, noerrorया notruncअनुरोध किया जाता है, इनपुट संसाधित किया जाएगा और पूर्ण आकार उत्पादन ब्लॉक में एकत्र जब तक इनपुट के अंत तक पहुँच गया है।
बिना ibs=और / या obs=तर्क के यह कोई फर्क नहीं पड़ता - क्योंकि ibsऔर obsडिफ़ॉल्ट रूप से एक ही आकार के हैं। हालाँकि, आप इनपुट बफ़रिंग के बारे में अलग-अलग आकार निर्दिष्ट करके स्पष्ट कर सकते हैं या तो निर्दिष्ट नहीं कर सकते (क्योंकि इसमें पूर्वता लगती है) ।bs=
उदाहरण के लिए, यदि आप करते हैं:
IN| dd ibs=1| OUT
... तो एक एकल उत्पादन ब्लॉक में हर एकल बाइट को इकट्ठा करके 512 बाइट्स का हिस्सा ddहोगा ।write()read()
अन्यथा, यदि आप करते हैं ...
IN| dd obs=1kx1k| OUT
... एक POSIX एक समय में अधिकतम 512 बाइट्स पर ddहोगा , लेकिन प्रत्येक मेगाबाइट-आकार के आउटपुट ब्लॉक (कर्नेल को अनुमति देने और संभवतः अंतिम को छोड़कर - क्योंकि वह ईओएफ है) पूर्ण-आकार वाले आउटपुट ब्लॉक में इनपुट एकत्र करके ।read() write()
हालांकि कल्पना से, हालांकि:
count=n
- केवल n इनपुट ब्लॉक कॉपी करें ।
count=i?bs=ब्लॉक करने के लिए नक्शे , और इसलिए count=आप दो ddएस की आवश्यकता होगी पर एक मनमानी सीमा को संभालने के लिए । दो ddएस के साथ यह करने का सबसे व्यावहारिक तरीका एक के आउटपुट को दूसरे के इनपुट में पाइप करके है, जो निश्चित रूप से मूल इनपुट प्रकार की परवाह किए बिना एक विशेष फ़ाइल को पढ़ने / लिखने के दायरे में रखता है ।
एक आईपीसी पाइप का मतलब है कि जब यह निर्दिष्ट करता है [io]bs=कि सुरक्षित रूप से ऐसा करने के लिए, आपको सिस्टम की निर्धारित PIPE_BUFसीमा के भीतर ऐसे मूल्यों को रखना चाहिए । POSIX कहा गया है कि सिस्टम कर्नेल केवल परमाणु गारंटी चाहिए read()और write()की सीमाओं के भीतर रों PIPE_BUFके रूप में परिभाषित किया limits.h। POSIX गारंटी देता है कि PIPE_BUFहो सकता है कम से कम ...
{_POSIX_PIPE_BUF}
- पाइप से लिखते समय अधिकतम बाइट्स जो परमाणु होने की गारंटी है।
- मान: 512
... (जो डिफॉल्ट ddi / o blockize होना भी होता है ) , लेकिन वास्तविक मूल्य कम से कम 4k है। एक अप-टू-डेट लिनक्स सिस्टम पर, यह डिफ़ॉल्ट रूप से, 64k है।
इसलिए जब आप अपनी ddप्रक्रियाओं को सेट करते हैं तो आपको इसे तीन मानों के आधार पर ब्लॉक कारक पर करना चाहिए :
- bs = (अवलोकन =
PIPE_BUFया कम)
- n = बाइट्स की कुल वांछित संख्या पढ़ी गई
- गिनती = एन / बी एस
पसंद:
yes | dd obs=1k | dd bs=1k count=10k of=/dev/null
10240+0 records in
10240+0 records out
10485760 bytes (10 MB) copied, 0.1143 s, 91.7 MB/s
ddगैर-शोध योग्य जानकारी को संभालने के लिए आपको i / ow / को सिंक्रोनाइज़ करना होगा। दूसरे शब्दों में, पाइप-बफ़र्स को स्पष्ट करें और वे एक समस्या बन जाते हैं। वह किस ddलिए है? यहां अज्ञात मात्रा yesबफर का आकार है - लेकिन यदि आप इसे किसी अन्य के साथ ज्ञात मात्रा में ब्लॉक करते हैं, ddतो थोड़ा सूचित गुणन dd डेटा की प्रतिलिपि बनाने के लिए उपयोग करना सुरक्षित कर सकता है (आंशिक रूप से पढ़ने या लिखने के कारण भ्रष्टाचार का कोई जोखिम नहीं) यहां तक कि जब मनमाने ढंग से इनपुट W / count=w / किसी भी POSIX सिस्टम पर किसी भी प्रकार के मनमाने इनपुट प्रकार को सीमित करने और एक भी बाइट को याद किए बिना।
यहाँ POSIX युक्ति से एक स्निपेट दिया गया है :
ibs=expr
- इनपुट ब्लॉक आकार निर्दिष्ट करें, बाइट्स में, (डिफ़ॉल्ट रूप से 512) है ।
expr
obs=expr
- आउटपुट ब्लॉक आकार निर्दिष्ट करें, बाइट्स में, (डिफ़ॉल्ट रूप से 512) है ।
expr
bs=expr
- इनपुट और आउटपुट ब्लॉक आकार दोनों को
exprबाइट्स, सुपरस्डिंग ibs=और पर सेट करें obs=। कोई रूपांतरण के अलावा अन्य हैं sync, noerrorऔर notruncनिर्दिष्ट किया जाता है, प्रत्येक इनपुट ब्लॉक कम ब्लॉक के योग के बिना एक भी ब्लॉक के रूप में उत्पादन में कॉपी किया जाएगा।
आप भी इस में से कुछ बेहतर समझाया मिल जाएगा यहाँ ।