dd: एकाधिक इनपुट फ़ाइलें


14

मुझे दो फ़ाइलों से विखंडन की आवश्यकता है:

अगर मुझे संपूर्ण फ़ाइलों की आवश्यकता है, तो मैं बस कर सकता हूं

cat file1 file2 > output

लेकिन मुझे पहली फ़ाइल से पहले 1 एमबी को छोड़ना होगा, और मुझे केवल दूसरी फ़ाइल से 10 एमबी चाहिए। के लिए एक नौकरी की तरह लगता है dd

dd if=file1 bs=1M count=99 skip=1 of=temp1
dd if=file2 bs=1M count=10 of=temp2
cat temp1 temp2 > final_output

क्या एक चरण में ऐसा करने की संभावना है? यानी, मध्यवर्ती परिणामों को बचाने की आवश्यकता के बिना? क्या मैं कई इनपुट फ़ाइलों का उपयोग कर सकता हूं dd?

जवाबों:


21

dd stdout को भी लिख सकते हैं।

( dd if=file1 bs=1M count=99 skip=1
  dd if=file2 bs=1M count=10  ) > final_output

यह शायद सबसे अच्छा तरीका है। आउटपुट फ़ाइल बंद नहीं है / फिर से खोल दी गई है (जैसे कि यह साथ है oflag=append conv=notrunc), इसलिए फाइलसिस्टम जो विलंबित आवंटन करते हैं (जैसे XFS) यह तय करने की संभावना कम से कम है कि फ़ाइल तब लिखी जा रही है जब वहाँ जाना अभी बाकी है।
पीटर कॉर्डेस

@PeterCordes यह एक अच्छा बिंदु है, लेकिन जब तक ddयह नहीं पूछा जाता है sync, विलंबित आवंटन को तुरंत वैसे भी किक नहीं करना चाहिए (जब तक कि मेमोरी तंग न हो, इस मामले में कोई भी तरीका आवंटन को स्थगित नहीं करेगा)।
स्टीफन किट

@StephenKitt: आप शायद सही हैं। मैं एक्सएफएस के सट्टा प्रचार के बारे में सोच रहा था , जहां इसे करीबी / फिर से खोलने के पैटर्न (कभी-कभी लॉग फाइल के लिए देखा जाता है) का विशेष रूप से पता लगाने की आवश्यकता होती है।
पीटर कॉर्डेस

3
इस तरह के गोले में bashऔर mkshजो एक उपसमूह में अंतिम कमांड के लिए कांटा का अनुकूलन नहीं करते हैं, आप इसे एक उपसमूह को कमांड समूह के साथ बदलकर थोड़ा अधिक कुशल बना सकते हैं। अन्य गोले के लिए, यह बात नहीं होनी चाहिए, और उपधारा दृष्टिकोण थोड़ा और भी कुशल हो सकता है क्योंकि शेल को स्टडआउट को बचाने और पुनर्स्थापित करने की आवश्यकता नहीं है।
स्टीफन चेज़लस

10

मुझे नहीं लगता कि आप एक ही ddमंगलाचरण में कई फ़ाइलों को आसानी से पढ़ सकते हैं , लेकिन आप आउटपुट फ़ाइल को कई चरणों में बनाने के लिए अपील कर सकते हैं:

dd if=file1 bs=1M count=99 skip=1 of=final_output
dd if=file2 bs=1M count=10 of=final_output oflag=append conv=notrunc

आप दोनों निर्दिष्ट करने की आवश्यकता conv=notruncऔर oflag=append। पहला आउटपुट ट्रंक करने से बचता है, दूसरा मौजूदा फ़ाइल के अंत से लिखना शुरू करता है।


8

इस बात को ध्यान में रखें कि ddएक कच्चा इंटरफ़ेस है read(), write()और lseek()सिस्टम कॉल के लिए। आप नियमित रूप से फ़ाइलों, ब्लॉक डिवाइसों और कुछ चरित्र उपकरणों (जैसे /dev/urandom) से डेटा का हिस्सा निकालने के लिए इसे मज़बूती से उपयोग कर सकते हैं , यह वह फाइल है जिसके लिए फ़ाइल के अंत तक पहुंचने की read(buf, size)गारंटी sizeनहीं है।

पाइप, सॉकेट और अधिकांश चरित्र उपकरणों (जैसे ट्टी) के लिए, जब तक आप read()आकार 1 नहीं करते, या GNU ddएक्सटेंशन का उपयोग नहीं करते, तब तक आपके पास ऐसी कोई गारंटी नहीं है iflag=fullblock

तो या तो:

{
  gdd < file1 bs=1M iflag=fullblock count=99 skip=1
  gdd < file2 bs=1M iflag=fullblock count=10
} > final_output

या:

M=1048576
{
  dd < file1 bs=1 count="$((99*M))" skip="$M"
  dd < file2 bs=1 count="$((10*M))"
} > final_output

या सीक ऑपरेटर के लिए बिलिन समर्थन के साथ गोले के साथ ksh93:

M=1048576
{
  command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
  command /opt/ast/bin/head -c "$((10*M))" < file2
}

या zsh( यहां आपके विकल्प का headसमर्थन करने पर -c)

zmodload zsh/system &&
{
  sysseek 1048576 && head -c 99M &&
  head -c 10M < file2
} < file1 > final_output

क्या आपको वास्तव में उद्धरण की आवश्यकता है? क्या परिणाम हमेशा पूर्णांक नहीं होगा?
स्टीवन पेनी

@StevenPenny, विस्तार को अधूरा छोड़ कर शेल को विभाजित करने के लिए कह रहा है + इसे ग्लोब जो यहाँ कोई मतलब नहीं होगा। के वर्तमान मूल्य पर किया जा रहा है $IFS। यह परिवर्तनशील / विस्तार की सामग्री के बावजूद है। बैश / POSIX गोले में एक चर को भूलने के लिए सुरक्षा निहितार्थ
स्टीफन चेज़लस

@ स्टीफन चेज़लस - पहले उदाहरण में, आप gddइसके बजाय उपयोग कर रहे हैं dd। क्या वह टाइपो है, या वह जानबूझकर है?
मार्टिन वेगाटर

3

एक बैश ism , और एक कार्यात्मक " बिल्ली का बेकार उपयोग " के साथ, लेकिन वाक्य रचना ओपी उपयोग करने के लिए निकटतम:

cat <(dd if=file1 bs=1M count=99 skip=1) \
    <(dd if=file2 bs=1M count=10) \
   > final_output

(यह कहा जा रहा है, स्टीफन किट का जवाब सबसे कुशल संभव तरीका है।)


3
सच पूछिये तो, <(...)एक है kshism जो दोनों zshऔर bashकी नकल की।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.