Dd के "a + b रिकॉर्ड" आँकड़ों में क्रमशः दो संख्याओं का क्या अर्थ है?


16

ddआँकड़ों में पहली 2 पंक्तियों में निम्नलिखित प्रारूप हैं:

a+b records in
c+d records out

2 संख्यात्मक मान क्यों? इस प्लस साइन का क्या मतलब है? यह आमतौर पर होता है a+0, लेकिन कभी-कभी जब मैं बड़े ब्लॉक आकार, dd प्रिंट का उपयोग करता हूं0+b records out

जवाबों:


16

इसका अर्थ है कि उस bsआकार के पूर्ण खंड और अतिरिक्त ब्लॉक जो कि bs से छोटे आकार के हैं।

pushd "$(mktemp -d)"
dd if=/dev/zero of=1 bs=64M count=1 # and you get a 1+0
dd if=1 of=/dev/null bs=16M # 4+0
dd if=1 of=/dev/null bs=20M # 3+1
dd if=1 of=/dev/null bs=80M # 0+1
_crap=$PWD; popd; rm -rf "$_crap"; unset _crap
# frostschutz's case
yes | dd of=/dev/null bs=64M count=1 # 0+1

संपादित करें : frostschutz के उत्तर में गैर-पूर्ण ब्लॉक उत्पन्न करने के लिए एक और मामले का उल्लेख किया गया है। पढ़ने योग्य। Https://unix.stackexchange.com/a/17357/73443 भी देखें


10

0+b records outके लिए b>1एक पाइप या किसी अन्य स्रोत है कि प्रदान नहीं कर सकते से पढ़ते समय आमतौर पर अधूरा पढ़ता हैं bs=Xडेटा की जल्दी से पर्याप्त। आप ddडेटा के पूर्ण ब्लॉक का उपयोग करने के लिए प्रतीक्षा करने के लिए बाध्य कर सकते हैं iflag=fullblock। यह विकल्प विशेष रूप से उपयोगी है यदि आप भी count=Xगिनती के रूप में उपयोग कर रहे हैं तो अपूर्ण ब्लॉकों को भी गिना जाता है, इसलिए यह फुलब्लॉक के बिना अविश्वसनीय है ...


4

दर्जनों मानक कमांड लाइन उपयोगिताओं हैं जो एक डिस्क्रिप्टर पर लटका सकते हैं और इनपुट की प्रतीक्षा कर सकते हैं। यह बहुत ज्यादा है कि वे सभी कैसे काम करते हैं। ddयह अद्वितीय है कि यह आपको दिखा सकता है कि एक विवरणक अभी कैसा दिखता है ।

व्यक्तिगत रूप से, मैं वास्तव में GNU iflag=fullblockविकल्प के पीछे की उपयोगिता को नहीं समझता । मेरा मतलब है, आप catअपने इनपुट को कम से कम आसानी से और बिना किसी चिंता के केवल i / o ब्लॉक आकार के बारे में बता सकते हैं।

लेकिन एक धारा का ddएक हिस्सा ले सकते हैं - और यह एक यथोचित आधुनिक प्रणाली पर read()/ write()सीमाओं पर कर सकता है।

{ (     sleep 1                     #don't write() til dd is definitely setup
        printf 123                  #write() 3  bytes
        printf %-30s\\n 456         #write() 31 bytes
        printf you\ there\?         #write() 10 bytes
)|      dd bs=64 count=2 conv=sync| #2 64 byte read()/write() \0-padded blocks
        od -vtc                     #show it with octal radices
}       2>/dev/null                 #drop stderr

0000000   1   2   3  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000040  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000060  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000100   4   5   6
0000120                                                          \n  \0
0000140  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000160  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000200

ddएक read()प्रति इनपुट ब्लॉक करता है। यदि यह जिस फ़ाइल में कोशिश read()करता है उसके पास उतना डेटा नहीं है जितना उसने अनुरोध किया है कि इससे कोई फर्क नहीं पड़ता - एक इनपुट के एक ब्लॉक के read()रूप में गिना जाता है । यह कैसे काम करता है - यह प्राथमिक उपयोगिता है।dd

जब इसने अपना काम किया है, तो ddइसके द्वारा निपटाए गए सभी इनपुट / आउटपुट ब्लॉकों पर रिपोर्ट। उपरोक्त आदेश फिर से चल रहा है, लेकिन इस बार के बजाय stdout छोड़ने ...


dd: warning: partial read (3 bytes); suggest iflag=fullblock
0+2 records in
2+0 records out
128 bytes (128 B) copied, 1.00161 s, 0.1 kB/s

हर बार ddकी थी read(0,&in,64) readवापस कम आया था - क्योंकि इसके stdin फ़ाइल वर्णनकर्ता वह अपने अनुरोध को पूरा करने के लिए जब यह इसे बनाया पर्याप्त बाइट्स इंतजार कर नहीं था। और इसलिए dd read()0 पूर्ण इनपुट रिकॉर्ड, और 2 लघु। यही उन रिपोर्टों का मतलब है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.